2012-07-04 38 views
2

可能重複:
What is going on with the types in this ghci session?爲什麼改變平方點自由變更類型

要嘗試和實踐了一下Haskell語言和了解自由,我與玩弄點一個函數來平方數

所以我開始定義

>let dup f x = f x x 

,所以我可以改寫DUP方面平方米(不擔心做DUP點免費現在)

>let sq x = dup (*) x 

和檢查平方米的類型我看到我期待看到

>:t sq 
>sq :: Num t => t -> t 

所以我刪除了X的,並得到

>let sq = dup (*) 
>:t sq 
sq :: Integer -> Integer 

我缺少什麼?

+4

單態的限制,讓我找到了重複。 –

+0

是的,這是一個dup - 看起來像我明天有更多的閱讀;) –

回答

3

你已經遇到了單態限制。 Haskell不會推斷函數的多態類型,除非它們是以「函數」風格給出的(不是免費的)。這意味着let sq = dup (*)不會鍵入檢查,但Haskell有所謂的「默認規則」意味着它默認爲單態型標準的數字類`整型>整數」

Prelude> :set -XNoMonomorphismRestriction 
Prelude> let dup f x = f x x 
Prelude> let sq = dup (*) 
Prelude> :t sq 
sq :: Num t => t -> t 
相關問題