Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell MonadState使用modify实现put_Haskell_State Monad - Fatal编程技术网

Haskell MonadState使用modify实现put

Haskell 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

我想用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吗?

感谢您的时间和帮助。

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
更简单)。