haskell书中的练习23.8.2
要求我构建如下状态:
put' :: s -> State s ()
put' s = undefined
-- should act like:
-- Prelude> runState (put "blah") "woot"
-- ((),"blah")
我唯一得到类型检查的实现是
import Control.Monad.Trans.State -- Not sure this is the right import
put' :: s -> State s ()
put' s = state $ \s -> ((), s)
但是这会返回runState
的参数中的状态,而不是put'
:
λ> runState (put' "blah") "woot"
((),"woot")
我需要修复什么haskell杂技?看不到我如何访问"blah"
。
答案 0 :(得分:5)
put' s = state $ \s -> ((), s)
^ ^
您将变量s
重用于两个不同的绑定。尝试使用不同的名称,解决方案将是显而易见的; - )
顺便说一句,您应该使用GHC / GHCi中的-Wall
标志启用警告。这可能会指出你定义了s
twise,第二个绑定影响了第一个。