我不明白为什么我不能构建一个看起来像 [1,"1",1.1]
的列表在 haskell 。我不认为这是静态类型的障碍,因为我认为 head
现在会有一个定义错误的类型,但后来我考虑了一下,运行时系统没有理由不实例化 head
的不同版本。每当将列表输入其中时,head [1,"1",1.1]
将输入为 List->Int
和 head (tail [1,"1",1.1])
将输入为 List->String
.既然运行时已经做了很多簿记,为什么它不提供各种 prelude 函数的更漂亮的多态(或者它是通用的)版本呢?我在这里缺少什么?
最佳答案
确实是打字阻止了这种情况。考虑列表的定义(注意类型参数 a
,它在您的类型中缺失):
data List a = Nil | Cons a (List a)
在
Cons a (List a)
可以看到列表头部的事物类型必须与它后面的元素类型相同。要回答您的问题,您并没有遗漏很多:正如您所说的运行时可以做到,但是在 Haskell 中,您希望在编译时而不是运行时做出这些类型决定。如果您想要异构列表,您可以在 Oleg Kiselyov 的著作 HList 中看到一些魔法。 (= 异构列表)。它可能不完全是您想要的,但它的方向大致相同。
关于list - 为什么haskell没有异构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4601620/