Quando si digita un'espressione expr
in GHCi, le seguenti cose accadono:
- L'espressione è di tipo controllato. Se c'è un errore, GHCi ti dice l'errore e si arrende.
- In caso contrario, ad esempio
expr
è stato trovato il tipo t
; GHC cerca di far corrispondere lo t
allo IO a
.
- Se riesce, esegue qualcosa come
it <- expr
, quindi se a
è un'istanza di Show
e non è ()
, viene eseguito print it
.
- Se non riesce e
t
è un'istanza di Show
, GHCi fa qualcosa come let it = expr
e quindi print it
.
- Altrimenti, si lamenta.
In sostanza, è necessario un modo al GHCi di eseguire sia azioni IO che ottenere i valori restituiti, e di giocare con valori puri e vedere ciò che si ottiene. Ecco perché GHCi si comporta come fa: se sembra che tu stia usando un'azione IO, GHCi lo farà, e poi se quell'azione ha un risultato che può essere mostrato ed è interessante (cioè non ()
) allora mostra risultato per te. Se non è in grado di mostrarti il risultato, non è un grosso problema, perché probabilmente hai semplicemente voluto eseguire l'azione IO comunque; se volessi il risultato lo avresti chiamato con <-
. D'altra parte, se sembra che la tua espressione sia non un'azione IO, GHCi la calcola e te la mostra, e se non può essere mostrata, GHCi non può fare nulla di utile (senza effetti collaterali questo tempo), così si lamenta.
In questo caso, return "abc"
typechecks come IO String
, e String
è un'istanza di Show
, così GHCi fa qualcosa di simile
it <- return "abc"
print it
che dalle leggi monade è esattamente lo stesso che solo facendo
print "abc"
quindi il risultato.
fonte
2012-08-13 17:25:21
IO. Una sessione ghci è come una speciale enorme IO Monade! – is7s