zer*_*ing 1 haskell category-theory
我试图了解https://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Void.html并有以下示例:
let x :: Either Void Int; x = Left Void
Run Code Online (Sandbox Code Playgroud)
代码不会被编译。如何让它运行?
dfe*_*uer 12
该Void类型的要点是它没有居民(除了“底部”值,如异常和无限循环)。你可以写
x, y, z :: Either Void Int
x = undefined
y = Left $ error "Whoops"
z = Left $ let q = q in q
Run Code Online (Sandbox Code Playgroud)
但所有这些都违反了Void.
type 的唯一“合法”值Either Void Int的形式为Right i,其中i :: Int。
实际上,您可以编写以下内容:
unEither :: Either Void a -> a
unEither (Left v) = absurd v
unEither (Right a) = a
Run Code Online (Sandbox Code Playgroud)
因为永远不可能创建一个 Void 类型的值,所以每个类型的值都Either Void Int必须有一个 Right 构造函数(或者在它的 Left 构造函数中有一个底部,这不是很有用)。例如,Right 1将是这种类型的有效值。