的空隙包声称提供适合居住型称为Void,其定义如下: -
newtype Void = Void Void
Run Code Online (Sandbox Code Playgroud)
这个定义比使用更简单的东西更好吗?说 -
data Void
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,那么两种数据类型都只包含底值.然而,后者更容易理解.
编辑:好的,所以我理解丹尼尔的答案如下.但是我想到了另一种可能更简单的方法来保持Haskell98兼容.我们可以使用Abstract数据类型,并且不向用户公开构造函数.
module Data.Void (Void) where
data Void = Void
Run Code Online (Sandbox Code Playgroud)
现在只有Data.Void模块中的代码可以构造一个Void,但是因为我们知道它没有,所以Void数据类型实际上是无人居住的.
会有用吗还是我错过了什么?
您的实现仍然不完整,因为您没有荒谬的功能:
absurd :: Void -> a
Run Code Online (Sandbox Code Playgroud)
Void应该是Haskell中的初始对象,这就是你需要荒谬函数的原因.我发现void包中的absurd实现非常优雅和恰当:
absurd (Void a) = absurd a
Run Code Online (Sandbox Code Playgroud)
这个定义让人联想到虚空与虚假前提的逻辑类比,从中可以推导出任何结论.它甚至使用引用自身的逻辑谬误来证明自己,这在逻辑上是荒谬的.