1

我被困在试图获得这个功能:

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

要运行ArrayState操作,我们称它为与数组arr一起操作 并获取结果并将结果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')

但这一切都失败了。有任何想法吗?

4

1 回答 1

3

我认为

runArrayState (MkArrayState act) arr = act arr

就是你要找的。

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

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

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)(即,没有类约束,在上述版本中也不需要)。

于 2013-04-18T02:31:58.380 回答