Haskell - 多态性和值取决于类型

时间:2015-07-01 03:16:46

标签: haskell polymorphism lambda-calculus type-families

从阅读维基百科条目lambda cube和此thread开始,当应用于Haskell时,我的理解是

  1. 按术语索引的术语系列 - 从值到值的典型函数
  2. 按类型索引的术语系列 - ??
  3. 由类型索引的类型族 - 类型构造函数中的参数多态,类型族
  4. 按术语索引的类型系列 - pi类型(在Haskell中使用单例类型伪造),sigma类型等...
  5. 如果我上面列出的例子错误,请纠正我。引自维基百科的文章:

      
        
    • 术语取决于类型或多态性。系统F,即二阶lambda演算(在图中写为λ2),仅通过强加此属性获得。
    •   

    我不知道Haskell如何从上面适应这个(2)。 Haskell在术语和类型以及类型擦除方面有很强的区别,因此您在OOP中没有反射内容,例如typeof(a)b.GetType(),然后在运行时根据类型信息返回一些值时间。

    所以我在Haskell中可以想到的与(2)有关的唯一事情可能是

    • mempty中的Data.Monoid中返回类型多态,其值取决于实例类型
    • 您在LHS上接收类型并在RHS上具有值构造函数的数据系列

    那会是正确的吗?虽然我觉得我没有建立所有联系......

    当参数多态满足(3)时,ad-hoc多态满足(2)是否正确?但是,ad-hoc与参数如何与类型与数据族的RHS差异相关?

    最后一件事,如何汇总类型值,如

    当他们缺少适合这张照片的类型背景时?我的猜测是这是(2)的一个例子?

1 个答案:

答案 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中。它们可以被视为对程序的某种预处理,它依赖于实例的自我强加的唯一性来确定性地填充细节。