對於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。)
謝謝。我冒昧地爲Haskell 2010報告的相關部分添加鏈接,我發現感謝您的回答。 – Jubobs 2014-11-22 15:52:00
違約規則在某些情況下仍然適用(我不能確切地說哪個)。例如,'show 1'將默認'1'爲'Integer'。單態限制放鬆只是避免了不必要地應用默認值。 – dfeuer 2014-11-22 17:49:40
@dfeuer重新排列了措辭,希望它更清晰一些。 – 2014-11-22 19:54:55