今天早些时候我看到了Inverse of the absurd function,尽管我很清楚drusba :: a -> Void
的任何可能的实现都不会终止(毕竟,不可能构造Void
),我不明白为什么absurd :: Void -> a
不是这样。考虑GHC实现:Data.Void.absurd与⊥有什么不同?
newtype Void = Void Void
absurd :: Void -> a
absurd a = a `seq` spin a where
spin (Void b) = spin b
spin
,在我看来,是无休止地解开无穷级数的Void
NEWTYPE包装,并且永远不会返回,即使你能找到一个Void
传递给它。这将是难以区分的实现将是这样的:
absurd :: Void -> a
absurd a = a `seq` undefined
鉴于此,为什么我们说absurd
是一个值得生活在Data.Void正常功能,但
drusba :: a -> Void
drusba = undefined
是函数不可能被定义?是否像下面这样?
absurd
是一个总的功能,得到的非底结果为在其(空)域的任何输入,而drusba
是局部的,从而底部结果对于一些(实际上所有)在其领域的输入。
除了底部,荒谬的功能将永远不会被调用。这是很少需要的,但它有用处。 – augustss