tick :: State Int Int
tick = get >>= \n ->
put (n+1) >>= \y ->
return n
我对如何
put (n+1)
感到困惑对这个函数的最终结果有任何影响。看起来这个函数应该返回初始状态不变。我试图在脑海中梳理一遍,但我一直没有足够的空间来固定东西。 :\如果有人可以指导我评估此功能,那将非常有帮助。
最佳答案
...How is puts updating the state in the first place? It seems to just be sitting there doing nothing...
啊,现在我明白你的问题了。你想知道如何
put
(和 get
)工作,对吧?也许 JavaScript 中的一个例子会有所帮助(一种具有实际可变状态的语言):
var s; // mutable state
function get() { return s; }
function put(x) { s = x; }
function tick() {
var n = get();
put(n + 1);
return n;
}
我希望这说明了这一点,而
n
不会改变,内部状态仍然会更新。如果执行 tick()
两次,状态将增加两次。回到 Haskell,这里是
State
的(相关部分)的完整定义。单子(monad):newtype State s a = State { runState :: s -> (a, s) }
instance Monad (State s) where
return a = State $ \s -> (a, s)
m >>= k = State $ \s -> let
(a, r) = runState m s
in runState (k a) r
get = State $ \s -> (s, s)
put s = State $ \_ -> ((), s)
现在尝试扩展您的
tick
通过手动内联 >>=
进一步示例, return
, get
和 put
.希望它会更清楚 State 是如何运作的。
关于haskell - 有人可以引导我完成这个 Haskell 函数(与状态单子(monad)相关)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1795785/