是否可以在GHCi提示下以增量方式与任意Monad实例进行交互?
您可以以交互方式输入“执行”命令:
Prelude> x <- return 5
但据我所知,一切都被迫进入IO()Monad。如果我想与任意Monad交互,该怎么办?
我是否被迫在巨型do { ... }
内编写完整的命令序列和/或直接使用中缀运算符?没关系,但我更喜欢“输入”一个任意的monad并一次与它进行交互。
可能的?
答案 0 :(得分:11)
就目前情况而言,IO
特定的行为依赖于IO
行为有点状态和难以理解的方式。所以你可以说像
s <- readFile "foo.txt"
并获得实际值s :: String
。
很明显,维持这种互动需要的不仅仅是Monad
结构。
n <- [1, 2, 3]
说出值 n有什么。
当然可以设想调整ghci来打开一个提示,允许在多个命令行交互中构造monadic计算do
- 样式,在提示关闭时提供整个计算。目前尚不清楚检查中间值意味着什么(除了为活跃的monad m (IO ())
生成m
类型的打印计算集合之外)。
但是,有必要问一下,IO
有什么特别之处可以隔离和推广出一个很好的交互式提示行为。在一个提示符下,我不禁嗅到一个关于交互式语音的共同价值观的气息,但我还没有找到它。有人可能会想到通过考虑将游标放入可能值的空间意味着什么来解决我的列表示例,IO
的方式有一个光标强加在它上面 - 和 - 现在的现实世界。谢谢你的思考。
答案 1 :(得分:4)
当然可以。只需注释您的类型
例如对于Maybe Monad
:
let x = return 5 :: Maybe Int
将导致
Just 5
或者列出monad:
let x = return 5 :: [Int]
将导致
[5]
当然你也可以在monad里玩:
let x = return 5 :: Maybe Int
x >>= return . (succ . succ)
将导致Just 7