2014-10-31 222 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擴展名來禁用該功能。