2014-10-31 183 views
4

我开始学习Haskell,虽然它通常很棒,但类型类系统的一些特殊性在数值聚焦的项目中导致了很多挫折。作为一个具体的例子,如果我打开ghci中,检查另外的类型,我得到:Haskell类型类混淆

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

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

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

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

回答

5

你已经击中了可怕的Monomorphism限制。您可以禁用它并获得通用功能。

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扩展名来禁用该功能。