10

是否可以在 GHCi 提示符下逐步与任意 Monad 实例交互?

您可以交互输入“do”命令:

Prelude> x <- return 5

但据我所知,一切都被迫进入 IO () Monad。如果我想与任意 Monad 交互怎么办?

我是否被迫在巨人内部编写整个命令序列do { ... }和/或直接使用中缀运算符?没关系,但我更喜欢“输入”一个任意的单子并一次与它交互一行。

可能的?

4

2 回答 2

11

就目前情况而言,IO特定的行为依赖于IO动作有点像状态和不可撤回的方式。所以你可以说像

s <- readFile "foo.txt"

并得到一个实际值s :: String

Monad很明显,维持这种互动不仅仅需要结构。这不会那么容易

n <- [1, 2, 3]

说n 有什么值。

人们当然可以想象调整 ghci 以打开一个提示,允许do在多个命令行交互中构建一元计算 - 风格,在提示关闭时提供整个计算。目前尚不清楚检查中间值意味着什么(当然m (IO ()),除了为活动的 monad生成 type 的打印计算集合m)。

但有趣的是,是否IO可以隔离和概括使良好的交互式提示行为成为可能的特殊之处。我情不自禁地嗅到了关于提示交互的上下文价值故事的味道,但我还没有找到它。有人可能会想象通过考虑将光标置于可能值的空间中意味着什么来解决我的列表示例,IO现实世界的此时此地强加光标的方式。谢谢你的思考。

于 2011-08-11T12:58:15.417 回答
5

你当然可以。只需注释您的类型。
例如Maybe Monad

let x = return 5 :: Maybe Int

将导致

Just 5

或者使用列表单子:

let x = return 5 :: [Int]

将导致

[5]

当然,你也可以在 monad 中玩耍:

let x = return 5 :: Maybe Int
x >>= return . (succ . succ)

这将导致Just 7

于 2011-08-11T11:45:45.180 回答