【发布时间】:2016-08-25 03:17:52
【问题描述】:
在 Haskell 中,我了解到有应用于类型签名的 类型变量(例如 id :: a -> a)和 种类(例如 Maybe :: * -> *),适用于类型构造函数和类型类。一个类型必须有 kind *(是一个具体类型)才能保存值。
我们使用类型变量来启用多态性:Nothing :: Maybe a 表示常量Nothing 可以属于一系列可能的类型。这使我相信 kinding 和 type 变量具有相同的目的。最后一个代码示例不会像Nothing :: Maybe 一样简单地工作,其中类型类Maybe 仍然使用* -> * 来表示该类型属于泛型家族?
我们所做的似乎是采用一个空参数 (* -> *) 并用代表相同方差水平的类型变量 (a) 填充它。
我们在另一个例子中看到了这种行为:
>>> :k Either
Either :: * -> * -> *
>>> :t Left ()
Left () :: Either () b
>>> :t Right ()
Right () :: Either a ()
为什么理论上需要区分种类和类型变量?
【问题讨论】:
-
@bheklilr 我认为 OP 有一些不同的想法,虽然我不太明白。
-
如果你启用
PartialTypeSignatures,你可以用_代替类型变量。例如,Nothing :: Maybe _或Left () :: Either _ _。您提出的将是一个简单的句法扩展,但我不确定它不会带来更多的混乱(尤其是在PolyKinds等其他扩展的上下文中)
标签: haskell polymorphism