【发布时间】:2013-04-18 02:25:04
【问题描述】:
我一直在尝试获取此功能:
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')
但这一切都失败了。有什么想法吗?
【问题讨论】:
-
ArrayState只有一个带有一个参数的构造函数。在几乎所有这种情况下,您都应该改用newtype。 -
哦,顺便说一句,如果您以这种惯用风格定义
ArrayState,您将免费获得runArrayState:newtype ArrayState arr e a = MkArrayState { runArrayState :: arr e -> (a, arr e) }