我知道ghci
在IO
monad中有效运作。最初我想象ghci
可能会处理另一个monad或IO
的转换,但文档清楚地表明这不起作用。
相反,我尝试使用隐式参数,但ghci
禁止所有尝试从ghci传递隐式参数,除了本地绑定let .. in
中的隐式参数,这是完全没用的。
foo <- meow_for_t "chicken"
bar <- let ?foo = foo in purr "tuna"
我们所包含的模块说:
purr (Eq t, ?foo :: Foo t) => String -> IO ()
purr s = ...
我希望purr "tuna"
单独使用foo <-
或?foo <-
或至少let ?foo = foo
sans in
就可以了。工作
我也许可以使用以下特技创建全局IORef
:
foo :: IORef (Foo Sometype)
foo = unsafePerformIO $ newIORef []
但显然我会在Foo
中牺牲我可爱的多态性。
在purr
中创建以类型安全方式修改ghci
全局状态的顶级命令ghci
的“正确方法”是什么?
理想情况下,应该有另一系列命令使用新类型重新创建所述全局状态,之后purr
应继续以类型安全的方式执行,只需使用新类型。
答案 0 :(得分:1)
隐式参数是GHC扩展。您可以在ghci上使用:set -XImplicitParams
启用它。