为什么haskell没有异构列表

dav*_*k01 4 polymorphism haskell types list static-polymorphism

我不明白为什么我不能构建一个看起来像[1,"1",1.1]haskell 的列表.我不认为它是静态类型阻碍因为我认为head现在会有一个不明确的类型,但后来我想到了它并没有理由运行时系统不会实例化不同版本的head任何时候list被输入到它中,因此head [1,"1",1.1]将被输入List->Int,head (tail [1,"1",1.1])并将被输入为List->String.由于运行时已经进行了大量的簿记,为什么它不提供各种前奏函数的更好的多态(或它是通用的)版本?我在这里错过了什么?

Sco*_*est 16

这确实是打字阻止了这一点.考虑列表的定义(注意类型参数a,类型中缺少该参数):

data List a = Nil | Cons a (List a)
Run Code Online (Sandbox Code Playgroud)

Cons a (List a)您可以看到列表顶部的事物类型必须与其后面的元素类型相同.要回答你的问题,你不会错过很多:正如你所说运行时可以做到的那样,但是在Haskell中你想在编译时做出这些打字决定,而不是运行时.

如果你想要异构列表,你可以看到Oleg Kiselyov在他的HList(=异构列表)工作中的一些魔法.它可能不是你想要的,但它是在同一个粗略的方向.

  • 为了清楚起见,HList的"异构列表"与右嵌套的2元组没有什么不同.有趣的部分不是列表本身,它是激动的类型级元编程深奥魔法Oleg用于构造在任意"列表"上工作的泛型函数. (5认同)
  • @ davidk01:以上就是你真正需要知道的.在您学习的这一点上,您不需要了解HList或其他类型hackery.首先学习基础知识. (2认同)