我开始学习Haskell,虽然它通常都很棒,但类型系统的一些特殊性在数字化项目中引起了很多挫折。举一个具体的例子,如果我打开ghci并检查添加的类型,我得到:
Prelude> :t (+)
(+) :: Num a => a -> a -> a
加法是超通用的,Num
是最通用的类型等,所以一切都有意义。但是如果我声明一些函数要添加,然后检查那个函数的类型,那么类型类将减少到Integer
!
Prelude> let add = (+)
Prelude> :t add
add :: Integer -> Integer -> Integer
那么......发生了什么?
答案 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
扩展名将其停用。