禁止在GHCi中打印IO结果?

Vla*_*ill 16 haskell ghci

IO在GHCi中运行动作时,它会自动运行动作并显示结果,这很好,但对于试图理解IO与非之间差异的学生而言并非如此IO.有没有办法改变GHCi的配置,以便它运行动作,但显示类似的东西<<IO Int action>>?更像是ST动作的结果(但应该执行动作):

现在它做到了:

> return 1 :: IO Int
1
> return 1 :: ST s Int
<<ST action>>
Run Code Online (Sandbox Code Playgroud)

我想要:

> return 1 :: IO Int
<<IO Int action>>
> putStrLn "bla"
bla
<<IO () action>>
Run Code Online (Sandbox Code Playgroud)

编辑:

  1. 我刚刚发现这IO可能是GHCi专门处理的唯一事情,ST实际上有Show (ST s a)返回的实例"<<ST action>>".所以,如果我可以禁用这种特殊处理IO就足够了.
  2. 至于允许的代码更改:手动更改计算表达式不是一个选项.库中的更改可能是,但我宁愿不这样做(我考虑创建包装IO类型,但是解释器不会运行该操作).如果GHCi能够IO以某种方式自动包装动作,那将是一种选择.

Mat*_*hid 2

这是个有趣的问题。我唯一能想到的就是编写某种自定义 prelude 模块,该模块导出名为 的类型IO,但这不是 GHCi 特殊情况下的“I/O 类型”。

当然,这根本没有任何帮助,除非学生记得导入这个而不是真正的前奏。我想你可以将其写入 GHCi 配置文件,但是......好吧,它肯定不完美。

我能想到的唯一其他方法是使用 GHC-API 自己重新实现 GHCi。但这听起来工作量太大了......