Haskell类型混淆

时间:2014-10-31 06:42:44

标签: haskell type-conversion

我开始学习Haskell,虽然它通常都很棒,但类型系统的一些特殊性在数字化项目中引起了很多挫折。举一个具体的例子,如果我打开ghci并检查添加的类型,我得到:

Prelude> :t (+)
(+) :: Num a => a -> a -> a

加法是超通用的,Num是最通用的类​​型等,所以一切都有意义。但是如果我声明一些函数要添加,然后检查那个函数的类型,那么类型类将减少到Integer

Prelude> let add = (+)
Prelude> :t add
add :: Integer -> Integer -> Integer

那么......发生了什么?

1 个答案:

答案 0 :(得分:5)

你已经遇到了可怕的单态限制。您可以禁用它并获取通用功能。

Prelude> let x = (+)
Prelude> :t x
x :: Integer -> Integer -> Integer
Prelude> :set -XNoMonomorphismRestriction
Prelude> let y = (+)
Prelude> :t y
y :: Num a => a -> a -> a

这里的概念是单态限制将使类型限制为单个(单个)混凝土块。您可以使用NoMonomorphismRestriction扩展名将其停用。