是什么让Haskell的类型系统比其他语言的类型系统更“强大”?

时间:2010-09-24 14:20:47

标签: haskell types type-inference type-systems hindley-milner

阅读Disadvantages of Scala type system versus Haskell?,我不得不问:具体来说,是什么让Haskell的类型系统比其他语言的类型系统(C,C ++,Java)更强大。显然,即使Scala也不能执行与Haskell类型系统相同的功能。具体来说,是什么让Haskell的类型系统(Hindley-Milner类型推断)如此强大?你能举个例子吗?

6 个答案:

答案 0 :(得分:22)

  

具体来说,是什么使得Haskell的类型系统

在过去十年中,它已被设计为灵活 - 作为财产验证的逻辑 - 并且功能强大。

多年来,Haskell的类型系统已经开发出来,以鼓励一种相对灵活,富有表现力的静态检查规则,由几组研究人员识别可以实现强大的新类编译时验证的类型系统技术。斯卡拉在那个地区相对不发达。

也就是说,Haskell / GHC提供了一个强大的逻辑,旨在鼓励类型级编程。在函数式编程领域中有一些相当独特的东西。

一些文章介绍了Haskell类型系统的工程方向:

答案 1 :(得分:13)

Hindley-Milner不是一个类型系统,而是一种类型推理算法。 Haskell的类型系统,在当天,曾经可以使用HM完全推断,但是这艘船长期以来用于现代Haskell扩展。 (ML仍然能够被完全推断出来)。

可以说,主要或完全推断所有类型的能力在表现力方面产生了力量。

但这在很大程度上不是我认为的问题。

dons链接的论文指向另一个方面 - Haskell类型系统的扩展使其完整(并且现代类型系列使得图灵完整语言更接近于价值级编程)。另一篇关于这个主题的好文章是McBride的Faking It: Simulating Dependent Types in Haskell

Scala上另一个帖子中的文章:“将类类型作为对象和隐含”进入了为什么你实际上可以在Scala中完成大部分工作,尽管有更多的显性。我倾向于感觉到,但这比真正的Scala经验更具有直觉,它更加特殊和明确的方法(C ++讨论称之为“名义”)最终有点混乱。

答案 2 :(得分:10)

让我们来看一个非常简单的例子:Haskell的Maybe

data Maybe a = Nothing | Just a

在C ++中:

template <T>
struct Maybe {
    bool isJust;
    T value;  // IMPORTANT: must ignore when !isJust
};

让我们在Haskell中考虑这两个函数签名:

sumJusts :: Num a => [Maybe a] -> a

和C ++:

template <T> T sumJusts(vector<maybe<T> >);

的差异:

  • 在C ++中,可能会犯更多错误。编译器不检查Maybe
  • 的使用规则
  • sumJusts的C ++类型未指定它需要+并从0投射。当事情不起作用时出现的错误信息是神秘而奇怪的。在Haskell中,编译器会抱怨该类型不是Num的实例,非常简单..

简而言之,Haskell有:

  • 的ADT
  • 类型的类
  • 非常友好的语法和对泛型的良好支持(在C ++中,人们试图避免因为他们的所有密码错误而被忽略)

答案 3 :(得分:7)

Haskell语言允许您编写更安全的代码而不会放弃功能。现在大多数语言都是为了安全而交换功能:Haskell语言可以表明可以同时使用这两种语言。

我们可以在没有空指针,显式演员,松散打字的情况下生活,并且仍然具有完美的表达语言,能够生成有效的最终代码。

更重要的是,Haskell类型系统,以及它的默认和纯粹的编码方法,可以提高复杂性,但并行性和并发性等重要问题。

只是我的两分钱。

答案 4 :(得分:5)

我非常喜欢和错过其他语言的一件事是支持类型,这是许多问题的优雅解决方案(包括例如多变量函数)。

使用类型类,定义非常抽象的函数非常容易,这些函数仍然是完全类型安全的 - 比如这个Fibonacci函数:

fibs :: Num a => [a]
fibs@(_:xs) = 0:1:zipWith (+) fibs xs

例如:

map (`div` 2) fibs        -- integral context
(fibs !! 10) + 1.234      -- rational context
map (:+ 1.0) fibs         -- Complex  context

您甚至可以为此定义自己的数字类型。

答案 5 :(得分:0)

什么是表现力?据我了解,类型系统允许我们施加代码什么约束,或者换句话说,可以证明代码的哪些属性。类型系统表现力越强,我们可以在类型级别上嵌入的信息越多(类型检查器可以在编译时使用它来检查我们的代码)。
这是其他语言所没有的Haskell的类型系统的一些属性。

  1. 纯度。
    纯度允许Haskell区分纯代码和具有IO能力的代码
  2. Paramtricity。
    Haskell对参数多态函数强制执行参数化,因此它们必须遵守某些定律。 (某些语言确实允许您表达多态函数类型,但它们不强制参数化,例如,即使参数是多态的,Scala也允许您对特定类型进行模式匹配)
  3. ADT
  4. 扩展名
    Haskell的基本类型系统是λ2的较弱版本,其本身并不十分令人印象深刻。但是有了这些扩展,它变得非常强大(甚至能够使用单例来表达依赖类型):
    1. 现有类型
    2. n级(全λ2)
    3. 类型家族
    4. 数据类型(允许在类型级别进行“类型化”编程)
    5. GADT ...