Отключить печать результатов ввода-вывода в 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 слишком много работы...