簡體   English   中英

GHCi是否不應用默認聲明來解決類型歧義?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM