我很难尝试这个功能:
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')
但都失败了。有什么想法吗?
答案 0 :(得分:3)
我认为
runArrayState (MkArrayState act) arr = act arr
正是您要找的。 p>
您的类型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)
的析构函数(即,没有类约束,在上面的版本中也不需要)。