从阅读维基百科条目lambda cube和此thread开始,当应用于Haskell时,我的理解是
如果我上面列出的例子错误,请纠正我。引自维基百科的文章:
- 术语取决于类型或多态性。系统F,即二阶lambda演算(在图中写为λ2),仅通过强加此属性获得。
我不知道Haskell如何从上面适应这个(2)。 Haskell在术语和类型以及类型擦除方面有很强的区别,因此您在OOP中没有反射内容,例如typeof(a)
或b.GetType()
,然后在运行时根据类型信息返回一些值时间。
所以我在Haskell中可以想到的与(2)有关的唯一事情可能是
mempty
中的Data.Monoid
中返回类型多态,其值取决于实例类型那会是正确的吗?虽然我觉得我没有建立所有联系......
当参数多态满足(3)时,ad-hoc多态满足(2)是否正确?但是,ad-hoc与参数如何与类型与数据族的RHS差异相关?
最后一件事,如何汇总类型值,如
Nothing :: forall a. Maybe a
Right 3 :: forall a. Num b => Either a b
当他们缺少适合这张照片的类型背景时?我的猜测是这是(2)的一个例子?
答案 0 :(得分:4)
按类型索引的字词
在lambda立方体中,这是参数多态。
在系统F中,多态术语看起来像将类型作为参数和返回术语的函数。
id : ∀ a. a -> a
id = Λa . λx : a . x -- Λ binds type args, λ binds term args
可以通过将它们显式应用于类型来实例化它们:
boolId : Bool -> Bool
boolId = id Bool
在Haskell中,面向用户的语言没有明确的类型应用程序和抽象,因为类型推断可以填充大多数(但不是全部)情况的细节。相比之下,GHC Core,GHC Haskell的中间语言,非常类似于System F,并且确实具有类型应用。
类型擦除与我们是否可以按类型索引术语是正交的。它发生在Haskell类型可以从运行时擦除,但我们可以想象其他语言没有统一大小的运行时对象,因此他们需要保持类型(或大小信息)。
按类型索引的类型
在lambda cube意义上,这意味着从类型和类型构造函数到类型和类型构造函数具有函数。
Haskell并没有类似的功能。类型系列最接近,但它们都是weaker and stronger.
键入类和lambda多维数据集
类型类是未在lambda多维数据集中建模的奇怪的野兽。在Haskell中,他们去了函数和字典传递,所以他们甚至没有出现在GHC Core中。它们可以被视为对程序的某种预处理,它依赖于实例的自我强加的唯一性来确定性地填充细节。