Haskell类型系统的本质:静态/动态,手动/推断?

时间:2014-09-25 10:07:56

标签: haskell type-systems typing dynamic-typing static-typing

我正在学习Haskell,并试图掌握Haskell类型系统的工作原理,重新确定事物的类型:动态,静态,手动设置,推断?

语言我知道了一点:

  • C,Java:由程序员手动设置,在编译时验证,如int i;,强类型(从字符串中减去整数是编译错误)。典型的静态类型系统。

  • Python:运行时自动推断的类型(动态类型), 强类型(从int中减去str会引发异常)。

  • Perl,PHP:在运行时自动推断类型(动态类型),弱类型。

  • Haskell:类型通常在编译时自动推断(在编译时,程序员明确设置此类型或类型),强类型。

Haskell的类型系统真的值得描述"静态"?我的意思是自动类型推断不是(经典的)静态类型。

3 个答案:

答案 0 :(得分:16)

  

Haskell的类型系统真的值得描述"静态"?我的意思是自动类型推断不是(经典的)静态类型。

类型推断在编译时完成。在编译时检查所有类型。 Haskell实现可能会在运行时擦除类型,因为它们具有类型安全的编译时证明。

所以说Haskell有一个"静态"是正确的。类型系统。 "静态"指编译时和运行时之间的阶段区别的一面。

引用罗伯特哈珀:

  

大多数编程语言都表现出相位差异   静态和动态的处理阶段。静态阶段包括   解析和类型检查以确保程序格式正确;   动态阶段包括执行结构良好的程序。一个   当形成良好的程序很好时,语言被认为是安全的   在执行时表现得很好。

来自Practical Foundations for Programming Languages,2014。

在此描述中,Haskell是一种具有静态类型系统的安全语言。

作为旁注,我强烈推荐上述书籍给那些有兴趣学习理解编程语言及其功能的基本技能的人。

答案 1 :(得分:9)

静态 - 动态轴和手动推断(或明显推断)的比例不是正交的。静态类型系统可以显示或推断,区别不适用于动态类型。 Python,Perl,PHP不推断类型,因为类型推断是通过静态分析(即在编译时)对静态类型的推导。

动态语言不会推断出类似的类型,它们只是在实际计算的同时计算值的类型。 Haskell确实静态推导出类型,它是静态类型的,你不必手动编写静态类型。它的类型系统确实不同于主流类型系统,但它的不同之处在于推断而不是显示(和许多其他功能),而不是不是静态的。

对于强/弱类型:Stop using that term,它被重载到无用的程度。如果“类型系统强弱/弱”,你的意思是“类型系统允许/禁止X”,然后说那个,因为如果你称之为强/弱键入你的大部分观众将使用不同的定义,并且不同意您对这些术语的使用。此外,正如你所看到的,对于X的大多数选择,它相当独立于你在标题中提到的两个区别(但是那时使用强大的同义词作为静态和弱的同义词作为动态的同义词,哦,我的!)。 / p>

答案 2 :(得分:1)

在去SO之前,最好检查一下维基百科,它说" Haskell有一个基于Hindley-Milner类型推断的强大的静态类型系统。"静态是指何时完成类型检查,因此无论是否推断类型都无关紧要。