При запуске IO
действий в приглашении GHCi он автоматически запускает действие и показывает результат, это хорошо, но не для студентов, пытающихся понять разницу между IO
и не IO
. Есть ли способ изменить конфигурацию GHCi так, чтобы она выполняла действие, но вместо этого отображает что-то вроде <<IO Int action>>
? Что-то похожее на результат для действий ST (но действие должно быть выполнено):
теперь он делает:
> return 1 :: IO Int
1
> return 1 :: ST s Int
<<ST action>>
Мне бы хотелось:
> return 1 :: IO Int
<<IO Int action>>
> putStrLn "bla"
bla
<<IO () action>>
Edit
- Я просто обнаружил, что
IO
, вероятно, единственное, что специально обработано GHCi,ST
имеет экземпляр дляShow (ST s a)
, который возвращает"<<ST action>>"
. Поэтому, возможно, если бы я мог отключить эту специальную обработкуIO
, этого было бы достаточно. - Что касается разрешенных изменений кода: ручное изменение оцениваемого выражения не является вариантом. Изменение в библиотеках может быть, но я бы предпочел не делать этого (я считал создание wrapped
IO
type, но тогда интерпретатор не запускает действие). Если GHCi может как-то автоматически обернуть действияIO
, это будет вариант.