Haskell MonadState实现put with modify

时间:2013-10-18 17:19:14

标签: haskell state-monad

我想实现put with modify

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

当我这样做时

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

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

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

获得预期类型m()
但是这个解决方案不起作用

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

1 个答案:

答案 0 :(得分:3)

modify的类型为

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

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

put s = modify $ const s

请注意,虽然您可以使用put来定义modify,但这意味着您无法给出modify的一般定义;相反,你必须为每个具有MonadState实例的具体monad执行此操作。这解释了为什么Control.Monad.StategetputMonadState的类方法:如何实现它们取决于特定的状态monad。然后,modify是根据getput定义的。