2

我想用 modify 来实现 put

    put :: s -> m ()
    modify :: (s -> s) m s

当我做

    put s = modify $ const((), s)

我收到错误,
预期类型:m()
实际类型:m((),s)
我尝试过这样的事情

    modify $ const((), s) >>= \x -> return (fst x)

获得预期的类型 m()
但此解决方案不起作用

有人可以向我解释如何使用 modify 来实现 put 吗?
感谢您的时间和帮助。

4

1 回答 1

3

modify有类型

modify :: (MonadState s m) => (s -> s) -> m ()

第一个参数是一个s -> s修改状态的普通函数。因此,当您尝试使用 时,您在正确的轨道上const,您不必将状态放在元组中:

put s = modify $ const s

请注意,虽然您可以根据 进行定义putmodify但这意味着您将无法给出 ; 的一般定义modify。相反,您必须为每个作为MonadState. 这就解释了为什么 inControl.Monad.State和是getput类方法MonadState:如何实现它们取决于特定的 state monad。modify, 那么, 是根据get和定义的put

于 2013-10-18T17:33:26.263 回答