list - 为什么haskell没有异构列表

标签 list haskell types polymorphism static-polymorphism

我不明白为什么我不能构建一个看起来像 [1,"1",1.1] 的列表在 haskell 。我不认为这是静态类型的障碍,因为我认为 head现在会有一个定义错误的类型,但后来我考虑了一下,运行时系统没有理由不实例化 head 的不同版本。每当将列表输入其中时,head [1,"1",1.1]将输入为 List->Inthead (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/

相关文章:

haskell - 如何推断递归函数的类型?

methods - "too many parameters"完美功能

python - 删除具有连续重复的元素

c++ - 为什么在尝试将新节点插入列表时出现错误

haskell - 如何修复 GHCI 中的 "variable not in scope"错误?

haskell - forkProcess有多危险?如何安全使用?

C++在构造函数中更改类型?

haskell - 库里-霍华德同构

java - 编写一个名为 Child 的简单接口(interface)(其中没有任何内容),并使用它创建一个只能存储 Boy 和 Girl 实例的 ArrayList

python - 访问字典键元组的各个元素