2015-10-03 25 views
15

Po uruchomieniu akcji IO w GHCi automatycznie uruchamia akcję i pokazuje wynik, jest to miłe, ale nie dla studentów próbujących zrozumieć różnicę między IO i non-IO. Czy istnieje sposób na zmianę konfiguracji GHCi tak, aby uruchamiał akcję, ale zamiast tego pokazuje coś takiego jak <<IO Int action>>? Coś bardziej jak wynik dla działań ST (ale działania powinny być wykonywane):Wyłącz drukowanie wyników IO w GHCi?

teraz robi:

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

chciałbym:

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

Edit:

  1. Po prostu stwierdziłem, że IO jest prawdopodobnie jedyną rzeczą obsługiwaną specjalnie przez GHCi, ST faktycznie ma instancję dla Show (ST s a), która zwraca "<<ST action>>". Więc może gdybym mógł wyłączyć to specjalne traktowanie IO, byłoby to wystarczające.
  2. Co do dozwolonych zmian kodu: ręczne zmienianie wyrażonego wyrażenia nie jest opcją. Mogła to być zmiana w bibliotekach, ale wolałbym tego nie robić (rozważałem stworzenie typu owiniętego IO, ale interpreter nie uruchomi tej akcji). Gdyby GHCi mógł jakoś automatycznie owijać akcje IO, byłaby to opcja.
+0

Czy zmiany kodu są dopuszczalne? Możesz zawrzeć wartość IO, którą masz, z inną, która najpierw wykonuje wartość, a następnie drukuje coś, co lubisz. – usr

+0

usr: Nie z wyrażenia, które należy poddać ocenie, zobacz moje zmiany w pytaniu. –

Odpowiedz

1

To interesujące pytanie. Jedyne, co mogę wymyślić, to napisanie jakiegoś niestandardowego modułu prelude, który eksportuje typ o nazwie IO, ale który nie jest "tym" typem I/O, który GHCi jest specjalną obudową.

Oczywiście nie jest to pomoc, chyba że uczeń pamięta o zaimportowaniu tego, zamiast prawdziwego preludium. Przypuszczam, że mógłbyś to zapisać w pliku konfiguracyjnym GHCi, ale ... cóż, na pewno nie jest idealny.

Jedyny inny sposób, jaki mogę wymyślić, to użyć GHC-API, aby samodzielnie zreimplementować GHCi. Ale to brzmi jak waaaay za dużo pracy ...