结果状态是提供的参数的状态,值是单位

The*_*Cat -2 haskell state-monad

23.8.2在haskell书中练习要求我构建如下状态:

put' :: s -> State s ()
put' s = undefined
-- should act like:
-- Prelude> runState (put "blah") "woot"
-- ((),"blah")
Run Code Online (Sandbox Code Playgroud)

我得到的唯一一个类型的实现是

import Control.Monad.Trans.State -- Not sure this is the right import
put' :: s -> State s ()
put' s = state $ \s -> ((), s)
Run Code Online (Sandbox Code Playgroud)

但这会在参数中返回状态runState,而不是put':

?> runState (put' "blah") "woot"
((),"woot")
Run Code Online (Sandbox Code Playgroud)

我需要修复什么haskell杂技?看不出我怎么能访问"blah".

chi*_*chi 5

put' s = state $ \s -> ((), s)
     ^            ^
Run Code Online (Sandbox Code Playgroud)

您将该变量重s用于两个不同的绑定.尝试使用不同的名称,解决方案将是显而易见的;-)

顺便说一句,您应该使用-WallGHC/GHCi中的标志启用警告.这可能会指出你已经定义了stwise,第二个绑定会影响第一个.