AFAIK,在 Haskell 中只有类型被值所占据,而不是类型构造函数。 Either
是类型 * -> * -> *
的二进制类型构造函数。 Left
和 Right
都将此类型构造函数应用于单个类型,该类型由传递的值提供。这是否意味着在这两种情况下 Either
只是部分应用,因此仍然是等待缺少的类型参数的类型构造函数?
let x = Right 'x' -- Either a Char
x
的类型为 Either a Char
。我假设这种类型的类型是 * -> *
。这显然是一种多态类型,而不是地面类型。然而 Either a Char
可以被 'x'
之类的值占据。
我怀疑类型变量 a
是 Right
案例的幻像类型。 b
代表 Left
。我知道与 Const
相关的幻像类型,其中根本不使用相应的类型变量。我走对了吗?
最佳答案
AFAIK, only types are inhabited by values in Haskell, not type constructors.
准点。
Left
andRight
both apply this type constructor to a single type
你不能这么说。 Left
和 Right
根本不存在于类型语言中,因此它们不会将任何东西应用于任何类型,它们只会将自己应用于 值。
x
has the typeEither a Char
. I would assume that this type would have the kind* -> *
您需要区分函数/构造函数参数和类型变量。基本上就是free and bound variables之间的区别. Either a Char
仍然有种类 *
,而不是 * -> *
,因为它已经应用于 a
。是的,这是一个类型变量,但它仍然是一个已经应用的参数。
Yet
Either a Char
can be inhabited by values like'x'
.
不完全——它可以被 Right 'x'
之类的值占据。
My suspicion is that the type variable
a
is a phantom type for theRight
case resp.b
forLeft
有点,但我不会称其为“幻像”,因为您不能只计算 Left
或 Right
。至少不会,除非您选择 Either Void b
,但在这种情况下,您没有 a
变量。
关于haskell - Either 类型构造函数是否包含左/右大小写的幻像类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47283106/