【发布时间】:2015-09-28 15:26:14
【问题描述】:
当我看到这段话时,我正在阅读 Haskell 上的 lecture note:
这个“不关心”就是参数多态中的“参数”的意思。所有 Haskell 函数的类型参数必须是参数化的;这些功能不得关心或根据这些参数的选择做出决定。当 a 是 Int 时,函数不能做一件事,而当 a 是 Bool 时,函数不能做另一件事。 Haskell 根本没有提供编写这样一个操作的工具。语言的这种属性称为参数性。
参数化有许多深刻而深刻的后果。一个后果是称为类型擦除的东西。因为一个正在运行的 Haskell 程序永远不能根据类型信息做出决定,所以在编译期间可以删除所有类型信息。尽管在编写 Haskell 代码时类型非常重要,但在运行 Haskell 代码时它们完全无关紧要。与需要在运行时保留类型的其他语言(例如 Python)相比,此属性为 Haskell 提供了巨大的速度提升。 (类型擦除并不是让 Haskell 更快的唯一因素,但 Haskell 的时钟有时比 Python 快 20 倍。)
我不明白“所有 Haskell 函数”如何参数化? Haskell中的类型不是显式/静态的吗?另外我真的不明白类型擦除如何改善 编译时间 运行时?
对不起,如果这些问题真的很基础,我是 Haskell 的新手。
编辑:
还有一个问题:为什么作者说“尽管类型在编写 Haskell 代码时很重要,但在运行 Haskell 代码时却完全无关紧要”?
【问题讨论】:
-
这句话从未声称“类型擦除提高了编译时间”,只是说它有助于改善 运行时。
-
函数是参数化的,如果你有一个类型参数
a,你永远不能检查a并在运行时根据它的类型做出决定。因此,您可以确定像map这样的函数对所有输入列表的行为一致,因此您无需在运行时维护列表元素类型。将此与 C# 之类的语言进行比较,C# 允许您在运行时通过反射获取真正的列表参数类型。