haskell - Either 类型构造函数是否包含左/右大小写的幻像类型?

标签 haskell polymorphism higher-kinded-types type-constructor

AFAIK,在 Haskell 中只有类型被值所占据,而不是类型构造函数。 Either 是类型 * -> * -> * 的二进制类型构造函数。 LeftRight 都将此类型构造函数应用于单个类型,该类型由传递的值提供。这是否意味着在这两种情况下 Either 只是部分应用,因此仍然是等待缺少的类型参数的类型构造函数?

let x = Right 'x' -- Either a Char

x 的类型为 Either a Char。我假设这种类型的类型是 * -> *。这显然是一种多态类型,而不是地面类型。然而 Either a Char 可以被 'x' 之类的值占据。

我怀疑类型变量 aRight 案例的幻像类型。 b 代表 Left。我知道与 Const 相关的幻像类型,其中根本不使用相应的类型变量。我走对了吗?

最佳答案

AFAIK, only types are inhabited by values in Haskell, not type constructors.

准点。

Left and Right both apply this type constructor to a single type

你不能这么说。 LeftRight 根本不存在于类型语言中,因此它们不会将任何东西应用于任何类型,它们只会将自己应用于

x has the type Either 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 the Right case resp. b for Left

有点,但我不会称其为“幻像”,因为您不能只计算 LeftRight。至少不会,除非您选择 Either Void b,但在这种情况下,您没有 a 变量。

关于haskell - Either 类型构造函数是否包含左/右大小写的幻像类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47283106/

相关文章:

haskell - 将整数转换为不带 'mod' 和 'div' 的数字列表

algorithm - 在 Haskell 中实现 IDA* 算法有什么问题?错误的启发式还是简单的错误代码?

kotlin - 使用默认参数调用重写的方法

java - Java中的高级泛型

haskell - 参数多态性和更高种类的类型之间有什么区别?

class - 我的 Parser 类的类型有什么问题?

haskell - Template Haskell 阶段限制的问题

oop - 有人可以向我解释一下多态性吗?

java - 在构造函数中调用可覆盖的方法,即使我们指定它来自父类(super class)?

scala - 高级类型参数中下划线的使用规则