2015-10-03 17 views
15

Quando si eseguono azioni IO in GHCi, viene eseguita automaticamente l'azione e viene visualizzato il risultato, questo è utile, ma non per gli studenti che cercano di capire la differenza tra IO e non- IO. C'è un modo per cambiare la configurazione di GHCi in modo che esegua l'azione, ma mostra qualcosa come <<IO Int action>> invece? Qualcosa di più come risultato di azioni ST (ma dovrebbe essere eseguita l'azione):Disabilitare la stampa dei risultati IO in GHCi?

ora fa:

> return 1 :: IO Int 
1 
> return 1 :: ST s Int 
<<ST action>> 

vorrei:

> return 1 :: IO Int 
<<IO Int action>> 
> putStrLn "bla" 
bla 
<<IO() action>> 

Edit:

  1. Ho appena scoperto che l'IO è probabilmente l'unica cosa gestita appositamente da GHCi, ST ha effettivamente istanza per Show (ST s a) che restituisce "<<ST action>>". Quindi forse se potessi disabilitare questo trattamento speciale di IO sarebbe sufficiente.
  2. Come per le modifiche consentite al codice: la modifica manuale dell'espressione valutata non è un'opzione. Il cambiamento nelle librerie potrebbe essere, ma preferirei non farlo (ho preso in considerazione la creazione del tipo IO spostato, ma l'interprete non eseguirà l'azione). Se GHCi potesse automaticamente avvolgere azioni IO in qualche modo, questa sarebbe un'opzione.
+0

Le modifiche al codice sono accettabili? Puoi avvolgere il valore di I/O che hai con un altro che esegue prima il valore e poi stampa qualcosa che ti piace. – usr

+0

usr: non dell'espressione da valutare, vedere le mie modifiche alla domanda. –

risposta

1

Questa è una domanda interessante. L'unica cosa che posso inventare è scrivere una sorta di modulo prelude personalizzato che esporta un tipo chiamato IO, ma che non è "il" tipo I/O che GHCi è un involucro speciale.

Naturalmente, questo non è di alcun aiuto a meno che lo studente non ricordi di importare questo piuttosto che il vero preludio. Suppongo che potresti scriverlo nel file di configurazione di GHCi, ma ... beh, non è certamente perfetto.

L'unico altro modo in cui posso pensare è utilizzare la GHC-API per implementare di nuovo GHCi. Ma sembra che waaaay troppo lavoro ...

Problemi correlati