【发布时间】:2011-06-03 20:24:30
【问题描述】:
我不明白为什么我不能在 haskell 中构建一个看起来像 [1,"1",1.1] 的列表。我不认为静态类型会妨碍我,因为我认为 head 现在会有一个定义错误的类型,但后来我想到了,运行时系统没有理由不实例化不同的版本的head 每当一个列表被输入到它,所以head [1,"1",1.1] 将被输入为List->Int 和head (tail [1,"1",1.1]) 将被输入为List->String。既然运行时已经做了很多记账,为什么它不提供各种前奏函数的更高级的多态(或者它是通用的)版本?我在这里错过了什么?
【问题讨论】:
-
@davidk01: 告诉我列表变量的第四个元素的类型...换句话说,一个作为函数参数的列表?就此而言,在编译时告诉我它是否有 第 4 个元素!如果列表或索引是变量,则在编译时无法知道类型。
-
davidk01:这就是问题所在——编译器不知道具体数字。如果编译器遇到
[1,"1",1.1] !! n,它无法判断表达式的类型。 -
davidk01:你不能告诉我它的类型是你不能构建这样一个列表的原因——你回答了你自己的问题。如果您知道您的列表将始终是
Int、String和Float,那么您将拥有一个元组而不是一个列表。 -
@davidk01:仔细阅读@Antal S-Z 所说的……异常不是返回值。
-
@davidk01:你并不是“太愚蠢以至于无法意识到什么对你有好处”,而且我很确定无论你尝试做什么都是完全合理的。但是,我怀疑您误解了一些术语——例如“静态类型”的真正含义以及运行时与编译时知识的含义——导致尴尬的沟通障碍。 Haskell 中的类型与 Javascript 或 Ruby 中的类型不同,只是提前知道。差异更深。我也许可以澄清一些事情,但这会很长而且不能真正回答这个问题本身......
标签: list haskell types polymorphism static-polymorphism