Haskell-运行monad状态

时间:2013-04-18 02:25:04

标签: haskell monads states

我很难尝试这个功能:

runArrayState :: Array arr => ArrayState arr e a -> arr e -> (a, arr e)

运行ArrayState操作让我们用数组 arr 将其命名为 act 并获取结果并返回结果 res 和原始数组 arr'作为一对(res,arr')。

ArrayState定义为

data ArrayState arr e a = MkArrayState (arr e -> (a, arr e))

我以为会:

runArrayState act arr = ((act arr), arr)

runArrayState MkArrayState (\ arr -> (res, arr)) arr' = (res, arr')

但都失败了。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为

runArrayState (MkArrayState act) arr = act arr

正是您要找的。

您的类型ArrayState被定义为具有单个构造函数MkArrayState,其参数是一个函数,该数组将数组转换为由结果和(可能)更新的数组组成的对。在上面的定义中,我们使用标识符act来引用此函数,并使用arr作为输入的数组。在定义的右侧,我们只需将函数act应用于arr即可获得所需的对。

或者,您可以将类型定义为

data ArrayState arr e a = MkArrayState {runArrayState :: arr e -> (a, arr e)}

或者,(很可能)甚至更好,

newtype ArrayState arr e a = MkArrayState {runArrayState :: arr e -> (a, arr e)}

这样,您将直接定义类型ArrayState arr e a -> arr e -> (a, arr e)的析构函数(即,没有类约束,在上面的版本中也不需要)。