左虚怎么办?

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)


ama*_*loy 6

因为永远不可能创建一个 Void 类型的值,所以每个类型的值都Either Void Int必须有一个 Right 构造函数(或者在它的 Left 构造函数中有一个底部,这不是很有用)。例如,Right 1将是这种类型的有效值。