【发布时间】:2016-07-24 20:35:10
【问题描述】:
我今天早些时候看到了Inverse of the absurd function,虽然我很清楚drusba :: a -> Void 的任何可能实现永远不会终止(毕竟,不可能构造Void),但我不明白为什么会这样absurd :: Void -> a 不是这样。考虑 GHC 实施:
newtype Void = Void Void
absurd :: Void -> a
absurd a = a `seq` spin a where
spin (Void b) = spin b
spin,在我看来,正在无休止地解开Void 新类型包装器的无限系列,即使你能找到Void 来传递它,也永远不会返回。无法区分的实现类似于:
absurd :: Void -> a
absurd a = a `seq` undefined
鉴于此,为什么我们说absurd 是一个应该存在于Data.Void 中的适当函数,但是
drusba :: a -> Void
drusba = undefined
是一个不可能被定义的函数吗?是不是像下面这样?
absurd是一个总函数,对于其(空)域中的任何输入给出非底部结果,而drusba是部分函数,对于其域中的某些(实际上是所有)输入给出底部结果。
【问题讨论】:
-
除此之外,永远不会调用荒谬的函数。它很少需要,但有它的用途。
标签: haskell