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

Let*_*t4U 5 haskell type-systems static-typing typing dynamic-typing

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

语言我知道一点:

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

  • Python:运行时自动推断的类型(动态类型),强类型(intstr引发异常中减去).

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

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

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

Don*_*art 16

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

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

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

引用罗伯特哈珀的话:

大多数编程语言在处理的静态和动态阶段之间表现出相位区分.静态阶段包括解析和类型检查,以确保程序格式正确; 动态阶段包括执行结构良好的程序.当格式良好的程序在执行时表现良好时,语言被认为是安全的.

来自编程语言的实践基础,2014年.

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

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


小智 9

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

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

至于强/弱类型:停止使用该术语,它被重载到无用的程度.如果"类型系统是强/弱"你的意思是"类型系统允许/禁止X"的,然后说的,因为如果你把它叫做强/弱类型观众的很大一部分都会有不同的定义,不同意使用这些条款.而且,正如你所看到的,对于X的大多数选择,它相当独立于你在标题中提到的两个区别(但是那时使用强大的同义词作为静态和弱的同义词作为动态的同义词,哦,我的!).