2015-10-03 4 views
15

Beim Ausführen von IO Aktionen in GHCi Prompt führt es automatisch die Aktion und zeigt Ergebnis, das ist schön, aber nicht für Studenten, die versuchen, den Unterschied zwischen IO und non IO zu verstehen. Gibt es eine Möglichkeit, die Konfiguration von GHCi so zu ändern, dass sie die Aktion ausführt, aber stattdessen so etwas wie <<IO Int action>> anzeigt? Etwas mehr wie Ergebnis für ST-Aktionen (aber Aktion durchgeführt werden soll):Drucken von IO-Ergebnissen in GHCi deaktivieren?

jetzt es tut:

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

ich möchte:

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

bearbeiten:

  1. Ich habe gerade festgestellt, dass IO ist wahrscheinlich das einzige, was speziell behandelt wird von GHCi, ST hat tatsächlich Instanz für Show (ST s a), die "<<ST action>>" zurückgibt. Also vielleicht, wenn ich diese spezielle Behandlung von IO deaktivieren könnte, wäre es ausreichend.
  2. In Bezug auf zulässige Codeänderungen: manuelle Änderung ausgewerteten Ausdruck ist keine Option. Änderung in Bibliotheken könnte sein, aber ich würde es vorziehen, dies nicht zu tun (Ich erwog, den umschlossenen Typ IO zu erstellen, aber dann wird der Interpreter die Aktion nicht ausführen). Wenn GHCi könnte automatisch Aktionen IO wickeln, wäre das eine Option.
+0

Sind Code-Änderungen akzeptabel? Sie könnten den IO-Wert, den Sie haben, mit einem anderen umbrechen, der zuerst den Wert ausführt, und dann etwas drucken, das Ihnen gefällt. – usr

+0

usr: Nicht von dem auszuwertenden Ausdruck, siehe meine Bearbeitungen der Frage. –

Antwort

1

Dies ist eine interessante Frage. Das Einzige, was ich mir vorstellen kann, ist eine Art benutzerdefiniertes Prelude-Modul zu schreiben, das einen Typ namens IO exportiert, der aber nicht "der" I/O-Typ ist, der GHCi ein spezielles Gehäuse ist.

Natürlich ist das überhaupt keine Hilfe, es sei denn, der Schüler erinnert sich daran, dies zu importieren, anstatt das eigentliche Vorspiel. Ich nehme an, Sie könnten das in die GHCi-Konfigurationsdatei schreiben, aber ... nun, es ist sicherlich nicht perfekt.

Der einzige andere Weg, an den ich denken kann, ist, die GHC-API zu verwenden, um GHCi grundsätzlich neu zu implementieren. Aber das klingt nach waaaay zu viel Arbeit ...