2015-05-26 3 views
8

Ho provato ad assegnare un valore sollevato a a.In GHCi, perché non posso mostrare `pure 1` in REPL?

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

Quando ho valutato a in REPL, stampa 1.

λ> a 
1 

Pertanto, ho pensato che ci potrebbe essere un'implementazione di show per a, e provato questo:

λ> show a 

Ma la GHCi tiri un errore:

<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 

Qualcuno ha qualche idee su questo?

+0

Hai provato a verificare ': digitare a'? Questo ti direbbe qualcosa, forse. – AJFarmar

+1

@AJFarmar In realtà, non tanto, dal momento che GHCi non ha ancora default 'm' su' IO', ancora. – chi

+2

Un po 'di meta-spiegazione è in ordine. Mentre si può pensare a GHCi come "interprete Haskell", è in realtà un tipo piuttosto diverso di bestia. È uno strumento per sviluppare interattivamente i programmi Haskell. Mentre Haskell si preoccupa molto di mantenere le cose carine e coerenti, GHCi si preoccupa soprattutto di convenienza e utilità. – dfeuer

risposta

19

GHCi esegue l'impostazione predefinita da Applicative f => f a IO. Quando si esegue

λ> a 
1 

in realtà esegue un IO Integer un'azione come

λ> let a = return 1 
λ> a 
1 

GHCi da stampe di default il risultato di IO azioni. Da qui il 1 nella riga dei risultati. (Piuttosto confusamente, questo 1 non è il valore di a, né l'uscita di esecuzione a come IO azione -. Appena il valore restituito di quest'ultimo)

GHCi utilizza un euristica sofisticati per gestire l'input dell'utente. Per prima cosa, prova a show, eventualmente impostando alcune classi di tipi come quelle numeriche. Questo fallisce nel tuo caso. Quando ciò non riesce, prova a vedere se l'input è un'azione IO. In tal caso, l'azione viene eseguita e, se il risultato può essere show, viene stampato.

Si noti che questa magia GHCi si verifica solo al livello più alto. Quando si prova a show a, GHCi prova la sua magia sull'intero show a, non su a, quindi lo stesso effetto non si verifica.