3
當我問+操作的類型是你所期望的爲什麼有些操作員在分配時會改變他們的類型?
Prelude> :t (+)
(+) :: Num a => a -> a -> a
當我操作分配給一個變量,那麼該類型的簽名更改
Prelude> let x = (+)
Prelude> :t x
x :: Integer -> Integer -> Integer
爲什麼會的類型操作員在分配時更改?
當我問+操作的類型是你所期望的爲什麼有些操作員在分配時會改變他們的類型?
Prelude> :t (+)
(+) :: Num a => a -> a -> a
當我操作分配給一個變量,那麼該類型的簽名更改
Prelude> let x = (+)
Prelude> :t x
x :: Integer -> Integer -> Integer
爲什麼會的類型操作員在分配時更改?
這是「可怕的單一同態限制」。從本質上講,當你定義一個
然後,默認情況下,Haskell的嘗試是聰明,挑一個不那麼 - 完全一般的類型。原因最初是爲了使Haskell更易於使用(沒有它,編寫含有不明確類型的程序可能更容易),但最近它似乎只是讓每個人都行,因爲這是非常意外的行爲。
的決議?
提供一個類型批註像
let { x :: Num a => a -> a -> a; x = (+) }
在正常Haskell代碼,方法( 3)是最強烈推薦的。當使用GHCi時,(1)和(2)更方便。
我總是有':一套+ M'在GHCI多行輸入,我覺得有很多比使用上可以和其他報表牙套更方便。 – bheklilr
GHC 7.8很難得到。 – PyRulez
在GHCi中,類型註釋也可以寫成'let y =(+):: Num a => a - > a - > a',這可能更可取。 – Laar