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

Haskell-多态性和值取决于类型,haskell,polymorphism,lambda-calculus,type-families,Haskell,Polymorphism,Lambda Calculus,Type Families,通过阅读维基百科的条目,当应用到Haskell时,我的理解是 按术语索引的术语族-从值到值的典型函数 按类型-索引的术语族 按类型索引的类型族-类型构造函数中的参数多态性,类型族 由术语索引的类型族-pi类型(在Haskell中使用单例类型)、sigma类型等 如果我把上面列出的例子弄错了,请纠正我。引用维基百科的那篇文章: 术语取决于类型或多态性。系统F,又名二阶lambda演算(在图中写为λ2),仅通过施加此属性获得 我不知道哈斯克尔是如何从上面理解这一点的。Haskell在术语和类型以

通过阅读维基百科的条目,当应用到Haskell时,我的理解是

  • 按术语索引的术语族-从值到值的典型函数
  • 按类型-索引的术语族
  • 按类型索引的类型族-类型构造函数中的参数多态性,类型族
  • 由术语索引的类型族-pi类型(在Haskell中使用单例类型)、sigma类型等
  • 如果我把上面列出的例子弄错了,请纠正我。引用维基百科的那篇文章:

    • 术语取决于类型或多态性。系统F,又名二阶lambda演算(在图中写为λ2),仅通过施加此属性获得
    我不知道哈斯克尔是如何从上面理解这一点的。Haskell在术语和类型以及类型擦除之间有很强的区别,因此在OOP中没有反射内容,例如
    typeof(a)
    b.GetType()
    ,然后在运行时根据类型信息返回一些值

    因此,在哈斯凯尔书中,我能想到的关于(2)的唯一一件事是

    • Data.Monoid
      中say
      mempty
      中的返回类型多态性,其中值取决于实例类型
    • 数据族,其中在LHS上采用类型,在RHS上采用值构造函数
    是这样吗?虽然我觉得我没有建立所有的联系

    如果说ad-hoc多态性满足(2)而参数多态性满足(3)是正确的吗?但是,特设与参数化如何与类型与数据族的RHS差异相关

    最后一件事,如何对类型值求和,例如

    • Right 3::对于所有a。Num b=>a b之一

    当他们缺少适合这张图片的类型上下文时?我猜这是(2)个按类型索引的术语的示例

    在lambda多维数据集中,这是参数多态性

    在SystemF中,多态项看起来像以类型作为参数和返回项的函数

    id : ∀ a. a -> a
    id = Λa . λx : a . x    -- Λ binds type args, λ binds term args
    
    可以通过将它们显式应用于类型来实例化它们:

    boolId : Bool -> Bool
    boolId = id Bool
    
    在Haskell中,面向用户的语言没有显式的类型应用程序和抽象,因为类型推理可以在大多数(但不是所有)情况下填充细节。相比之下,GHC核心(GHC Haskell的中间语言)与系统F非常相似,并且具有类型应用程序

    类型擦除与我们是否可以按类型索引项是正交的。在Haskell中,类型可以从运行时中删除,但我们可以想象其他没有统一大小的运行时对象的语言,因此它们需要保留类型(或大小信息)

    按类型索引的类型

    在lambda多维数据集意义上,这意味着拥有从类型和类型构造函数到类型和类型构造函数的函数

    Haskell没有类似的功能。类型族最接近,但它们都是

    类型类和lambda立方体


    类型类是不在lambda多维数据集中建模的奇怪野兽。在Haskell中,它们被分解成函数和字典传递,所以它们甚至没有出现在GHC核心中。它们可以被看作是程序的某种预处理,依赖于实例的自我强加唯一性来确定地填充细节

    感谢您的解释和康纳答案的有用链接。所以我想说的是,lambda立方体仅仅是对基础lambda演算的不同扩展的偏序集。还有其他扩展,如Fc[其中类型族与Fω有些相似,但不完全相似],或OO中的子类型多态性。简而言之,lambda多维数据集总结了是否允许从X到Y的函数,其中X和Y可以是“类型”或“术语”。仅供参考,这是lambda多维数据集的一个简洁的教程实现,通过允许/禁止抽象,您可以轻松地在多维数据集的各个点之间移动。谢谢!我到家后会读的。因此,lambda cube实际上在种类级别和更高级别上没有任何作用,尽管这可能不是必需的。至于数据族,即使它们更类似于按类型索引的开放GADT,您如何对它们进行分类?给定数据族DF t::*,由于注入性,
    DF::*->*
    是正确的。因此,我们不能说数据族与类型族(3)不同。我被困在类型族的RHS本身就是类型,而数据族的RHS是值构造函数的部分。