我想实现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吗? 感谢您的时间和帮助。
答案 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.State
,get
和put
是MonadState
的类方法:如何实现它们取决于特定的状态monad。然后,modify
是根据get
和put
定义的。