此Haskell data
语句的等效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 monad”(在其“虚拟世界”中)来寻求“真正理解”monad。因为我是那种需要自己从头开始构建东西以便真正理解“某事”的人,所以对于monad概念有一种“理解/解释”。所以我在这里走同样的路线。整个代码上下文在这里https://gist.github.com/NeuronQ/11119444/adbf0a9d6d17d4231d7ec68f565203f8dd75f702,但对于任何有经验的Haskell程序员来说,它可能看起来毫无意义和“残忍”。
答案 0 :(得分:5)
你想要像
这样的东西newtype CWIO a = CWIO { unCWIO :: CWorld -> (a, CWorld) }
允许您定义适当的实例,并使用CWIO
和unCWIO
在包装的CWIO
计算和未打包的底层函数之间来回移动。 newtype
是data
的变体,为具有单个构造函数的包装器量身定制和优化。
请注意,通过对CWIO
采用这样的定义,您最终会获得与专为State
州专门的CWorld
monad相同的内容。