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

The nature of Haskell type system: static/dynamic, manual/inferred?

我正在学习haskell,并试图掌握haskell类型系统的工作原理,重新计算出什么是事物的类型:动态、静态、手动、推断?

语言我知道一点:

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

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

  • perl,php:运行时自动推断的类型(动态类型),弱类型。

  • haskell:通常在编译时自动推断的类型(或者由程序员在编译前显式设置此类型或类型),强类型。

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


Does Haskell's type system really deserve description"static"? I mean automatic type inference is not (classic) static typing.

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

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

引用罗伯特·哈珀的话:

Most programming languages exhibit a phase distinction between the
static and dynamic phases of processing. The static phase consists of
parsing and type checking to ensure that the program is well-formed;
the dynamic phase consists of execution of well-formed programs. A
language is said to be safe exactly when well-formed programs are well
behaved when executed.

《编程语言实用基础》,2014年。

在这个描述下,haskell是一个具有静态类型系统的安全语言。

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


静态动态轴和手动推断(或清单推断)比例不是正交的。静态类型系统可以是显式的或推断的,这种区别不适用于动态类型。python、perl、php不推断类型,因为类型推断是通过静态分析(即在编译时)推断静态类型。

动态语言并不是这样推导类型的,它们只是在实际计算的同时计算值的类型。haskell确实会静态地推导类型,它是静态类型的,您不必手动编写静态类型。它的类型系统确实不同于主流类型系统,但不同之处在于它是被推断的而不是显式的(以及许多其他特性),而不是静态的。

至于强/弱类型:停止使用该术语,它会过载到无用的程度。如果"类型系统强/弱",你的意思是"类型系统允许/禁止X",那么说吧,因为如果你称之为强/弱类型,你的大部分听众会有不同的定义,不同意你使用这些术语。而且,正如你所看到的,对于大多数x的选择,它相当独立于你在标题中提到的两个区别(但是,还有一个相当大的组,它使用强作为静态的同义词,使用弱作为动态的同义词,哦,天哪!).


在这样做之前,最好先检查一下维基百科,它说"Haskell有一个基于Hindley-Milner类型推断的强大的静态类型系统。"静态是指类型检查完成后,类型是否被推断并不重要。