Haskell:将`type`转换为`data`语句

时间:2014-04-20 17:19:10

标签: haskell types monads algebraic-data-types io-monad

此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程序员来说,它可能看起来毫无意义和“残忍”。

1 个答案:

答案 0 :(得分:5)

你想要像

这样的东西
newtype CWIO a = CWIO { unCWIO :: CWorld -> (a, CWorld) }

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

请注意,通过对CWIO采用这样的定义,您最终会获得与专为State州专门的CWorld monad相同的内容。