[英]Does GHCi not apply the default declaration to resolve type ambiguity?
對於Haskell來說相對較新,我試圖圍繞以下的差異(我有信心,這是有充分理由的)。 也許我的問題僅僅源於對GHCi的誤解,但是當我可以懷疑地休息時,我會在晚上睡得更好。
開始。 如果在將一個名稱foo
綁定到腳本中的某個整數表達式(這里只是1
)並編譯該腳本之后,我將后者加載到GHCi中:t
告訴我foo
的類型是Integer
。
$ 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
類型的歧義得到了解決,我認為,這是在Prelude
某處指定的:
default (Integer, Double)
到現在為止還挺好。 但是,當我在GHCi中直接執行看似等效的let
綁定時, :t
告訴我后者仍將foo
視為多態數字常量, 而不是 Integer
:
$ ghci
λ> let foo=1
λ> :t foo
foo :: Num a => a
如何解釋這種差異? 它背后的理由是什么? GHCi是否不應用默認聲明來解決類型歧義? 如果確實如此,它在什么情況下呢?
(有關信息,我使用的是GHC 7.8.3。)
ghci是否不應用默認聲明來解決類型歧義?
在GHC 7.8或更高版本中, 單態限制確實在GHCi shell內部關閉,因此交互式shell中的聲明不會將Num默認規則應用於不在lambda綁定器下的頂級表達式(根據單態限制)。 單態限制仍將適用於加載的外部模塊。
您可以使用以下命令切換:set -XMonomorphismRestriction
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.