Haskell MonadState使用modify实现put
我想用modify实现putHaskell MonadState使用modify实现put,haskell,state-monad,Haskell,State Monad,我想用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() 但这一解决方案并不奏效 有人能给我解释一下如何使用mo
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吗?
感谢您的时间和帮助。
modify
has type
modify :: (MonadState s m) => (s -> s) -> m ()
第一个参数是一个普通的s->s
函数,用于修改状态。因此,当您尝试使用const
时,您不必将状态放在元组中:
put s = modify $ const s
请注意,虽然您可以根据
modify
定义put
,但这意味着您无法给出modify
的一般定义;相反,您必须为每个具体的monad执行此操作,它是MonadState
的一个实例。这就解释了为什么在Control.Monad.State
中,get
和put
是MonadState
的类方法:如何实现它们取决于特定的Monad状态modify
是根据get
和put
定义的。谢谢您的回复,我应该如何使用put和get实现modify。您的put实现似乎无法与我的modify实现一起工作。我的modify实现是modify f=do{x您对modify
的实现是正确的,但它是在get
和put
方面实现的;因此,如果您试图用modify
实现put
,它就会变成循环。您是在实现特定状态monad的方法,还是在尝试编写一般实现?@Neckronis I更新t他回答让问题更清楚。这有帮助吗?我正在尝试编写一个通用实现。您更新的答案很有帮助,因此如果我用modify定义put,我将无法用put和get实现modify的通用定义?对吗?是的。在这种情况下,您无法为这三种方法提供默认实现。您如何理解t和put状态取决于具体的数据类型;因此,您通常可以根据get
和put
定义modify
,如在Control.Monad.state
中,或者根据modify
定义put
(尽管前一种方法更好,因为put
比modify
更简单)。