【问题标题】:Haskell- Running monad statesHaskell - 运行 monad 状态
【发布时间】: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,您将免费获得runArrayStatenewtype ArrayState arr e a = MkArrayState { runArrayState :: arr e -> (a, arr e) }

标签: haskell monads states


【解决方案1】:

我认为

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多