2014-11-22 59 views
3

對於Haskell來說,這是一個相對較新的東西,我試圖圍繞以下差異來解決我的問題(對此我有充分的理由,我敢肯定)。 也許我的問題只是源於對GHCi的誤解,但我可以在晚上睡得更好,因爲我可以放心解決問題。GHCi是否不應用默認聲明來解決類型歧義?

在這裏。如果在將一個名稱foo綁定到某個積分表達式(此處簡稱爲1)並編譯該腳本後,我在GHCi中加載後者,:t告訴我foo的類型爲Integer。到目前爲止

default (Integer, Double) 

,那麼好:

$ printf %s\\n "foo=1" > foo.hs 
$ ghci 
λ> :l foo.hs 
[1 of 1] Compiling Main    (foo.hs, interpreted) 
Ok, modules loaded: Main. 
λ> :t foo 
foo :: Integer 

據我瞭解,在foo類型的不確定性得到解決由於一些default declaration,其中,我相信,在Prelude某處指定。然而,當我進行一個看似等價let內GHCI直接結合,:t告訴我,後者仍然把foo作爲一個多態數值不變,作爲Integer

$ ghci 
λ> let foo=1 
λ> :t foo 
foo :: Num a => a 

這又如何差異來解釋?它背後的理由是什麼? GHCi是否不應用default declaration來解決類型歧義?如果是這樣,它在什麼情況下呢?

(有關信息,我使用GHC 7.8.3。)

回答

4

是否ghci的不適默認的聲明來解決型歧義?

在GHC 7.8或更高Monomorphism Restriction是GHCI外殼裏面確實關閉,所以在交互的shell聲明將不適用不低於(每單態限制)拉姆達粘合劑的Num默認規則,以頂級的表達。單態限制仍然適用於加載的外部模塊。

您可以使用:set -XMonomorphismRestriction來切換。

+0

謝謝。我冒昧地爲Haskell 2010報告的相關部分添加鏈接,我發現感謝您的回答。 – Jubobs 2014-11-22 15:52:00

+2

違約規則在某些情況下仍然適用(我不能確切地說哪個)。例如,'show 1'將默認'1'爲'Integer'。單態限制放鬆只是避免了不必要地應用默認值。 – dfeuer 2014-11-22 17:49:40

+0

@dfeuer重新排列了措辭,希望它更清晰一些。 – 2014-11-22 19:54:55