2015-05-26 75 views
8

我試圖分配一個提升值到a在GHCi中,爲什麼我不能在REPL中顯示'純1'?

λ> :m Control.Applicative 
λ> let a = pure 1 

當我在REPL評估a,它打印1

λ> a 
1 

因此,我認爲有可能是show的實施a,並試圖這樣:

λ> show a 

但GHCI拋出一個錯誤:

<interactive>:70:1-4: 
    No instance for (Show (f0 a0)) arising from a use of ‘show’ 
    The type variables ‘f0’, ‘a0’ are ambiguous 
    Note: there are several potential instances: 
     instance (Integral a, Show a) => Show (GHC.Real.Ratio a) 
     -- Defined in ‘GHC.Real’ 
     instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’ 
     instance (Show a, Show b, Show c) => Show (a, b, c) 
     -- Defined in ‘GHC.Show’ 
     ...plus 32 others 
    In the expression: show a 
    In an equation for ‘it’: it = show a 

沒有人有任何關於這個的想法?

+0

你試過檢查':type a'嗎?那可能會告訴你一些事情。 – AJFarmar

+1

@AJFarmar其實,並沒有那麼多,因爲GHCi並沒有將'm'默認爲'IO'。 – chi

+2

元解釋的一點是爲了。雖然你可能認爲GHCi是一個「Haskell解釋器」,但它實際上是一種非常不同的野獸。它是交互式開發Haskell程序的工具。儘管Haskell對保持良好和一致性很擔心,但GHCi主要關心便利性和實用性。 – dfeuer

回答

19

GHCi默認Applicative f => fIO。當你做

λ> a 
1 

你實際上默認打印運行IO Integer動作如

λ> let a = return 1 
λ> a 
1 

GHCI的IO行動的結果。因此結果行中的1。 (很容易混淆的,這1不是a值,也不運行a作爲IO動作的輸出 - 只是後者的返回值)

GHCI使用複雜的試探法來處理用戶輸入。首先,它會嘗試show它,可能會默認某些類型類,如數字類。這在你的情況下失敗。如果失敗,它會嘗試查看輸入是否爲IO操作。在這種情況下,將執行該操作,如果結果爲show ed,則會打印該操作。

請注意,這GHCi魔術只發生在頂層。 當你嘗試show a時,GHCi在整個show a上嘗試它的魔法,而不是在a上,所以同樣的效果不會發生。

相關問題