2

data这个 Haskell语句的等效语句是什么type

type CWIO a = CWorld -> (a, CWorld)

...这将允许我写:

instance Monad CWIO where
    (action1 >>= action2) w0 =
        let (x1, w1) = action1 w0
            (x2, w2) = action2 x1 w1
        in  (x2, w2)
    return a = \world -> (a, world)

其中CWorld:

data CWorld = CWorld {
    cin :: String,
    cout :: String
}

我正在通过实际构建一个实际工作的“虚拟 IO 单子”(在其“虚拟宇宙”中)来寻求“真正了解”单子。对 monads 的概念进行某种“通过构建/工程来理解/解释”,因为我是那种需要自己从头开始构建一些东西才能真正理解“某物”的人,所以我要去这里的路线相同。整个代码上下文在这里https://gist.github.com/NeuronQ/11119444/adbf0a9d6d17d4231d7ec68f565203f8dd75f702,但对于任何有经验的 Haskell 程序员来说,它可能看起来毫无意义和“残暴”。

4

1 回答 1

5

你想要类似的东西

newtype CWIO a = CWIO { unCWIO :: CWorld -> (a, CWorld) }

这将允许您定义适当的实例并使用CWIO和在包装计算和未包装的底层函数unCWIO之间来回移动。是为具有单个构造函数的包装器量身定制和优化的变体。CWIOnewtypedata

请注意,通过为CWIO您采用这样的定义,最终将得到与State专门用于CWorld状态的 monad 等效的东西。

于 2014-04-20T17:27:08.657 回答