2011-05-19 77 views
15

我開始Haskell ...我嘗試以兩種不同的方式編寫以下平凡函數,讓Haskell決定類型,並且類型系統在每個函數中執行一些不同的操作案件。這種行爲的解釋是什麼?將函數轉換爲無點樣式改變其類型

Prelude> let f x = 2 * x 
Prelude> let g = (2*) 
Prelude> :info f 
f :: Num a => a -> a -- Defined at <interactive>:1:5 
Prelude> :info g 
g :: Integer -> Integer  -- Defined at <interactive>:1:5 

謝謝!

+0

可能重複(HTTP:/ /stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu 2015-09-10 08:34:53

回答

12

這就是所謂的monomorphism restriction

基本上,這意味着看起來像x =的頂級綁定被強制爲非多態,除非您指定了類型簽名。參數綁定,即f x =不受影響。有關此限制存在的詳細信息,請參閱鏈接。

通常情況下,您會在應用限制時收到錯誤消息,但在此情況下,GHCi能夠使用默認類型將Num a => a更改爲Integer

,最簡單的辦法逃避它要麼使用一個明確的類型簽名,或把

{-# LANGUAGE NoMonomorphismRestriction #-} 

在您的模塊的頂部,或-XNoMonomorphismRestriction運行GHCI。

+0

我誤解了,還是應該「......被迫爲非特別多態」? '讓f = []'似乎可以保持它在ghci中的多態性。 – dainichi 2011-09-05 08:56:32

1

由於g定義不明確命名它的參數,你碰上monomorphism restriction,防止g被多態和(在本例中)造成GHC默認爲Integer

+0

我還有一件事要學習:-)謝謝! – Frank 2011-05-19 01:05:38

3

正如其他人指出的,這是由「單態限制」引起的。

MR對Haskell編譯器的作者很有用,關於在一般語言中是否值得使用它,存在爭議。但是每個人都同意一件事:在GHCi提示下,MR不過是一種滋擾。

在即將發佈的GHC版本中,MR在這種情況下可能會被默認關閉。現在,你應該在GHCI通過創建包含這樣一行在你的home目錄下名爲「.ghci」的文本文件禁用它:?什麼是單態的限制]的

:set -XNoMonomorphismRestriction 
相關問題