Отключить печать результатов ввода-вывода в GHCi?

При запуске 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, это будет вариант.

Ответы

Ответ 1

Это интересный вопрос. Единственное, что я могу придумать, это написать какой-то пользовательский модуль prelude, который экспортирует тип с именем IO, но который не является "типом ввода/вывода", который GHCi является специальным корпусом.

Конечно, это вообще не помощь, если ученик не помнит, чтобы импортировать это, а не настоящую прелюдию. Я полагаю, вы могли бы записать это в конфигурационный файл GHCi, но... ну, это, конечно, не идеально.

Единственный другой способ, который я могу придумать, - использовать GHC-API в основном для переопределения GHCi. Но это звучит как waaaay слишком много работы...