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

时间:2016-06-15 18:13:49

标签: haskell state-monad

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"

1 个答案:

答案 0 :(得分:5)

put' s = state $ \s -> ((), s)
     ^            ^

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

顺便说一句,您应该使用GHC / GHCi中的-Wall标志启用警告。这可能会指出你定义了s twise,第二个绑定影响了第一个。