haskell - 有人可以引导我完成这个 Haskell 函数(与状态单子(monad)相关)吗?

标签 haskell state monads

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 , getput .希望它会更清楚 State 是如何运作的。

关于haskell - 有人可以引导我完成这个 Haskell 函数(与状态单子(monad)相关)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1795785/

相关文章:

haskell - 函数列表中的函数组成!

javascript - 为什么在渲染中返回之前将状态值添加到变量

javascript - 如何更新状态数组?

haskell - Haskell 中的所有图形和网络库是如何实现的?

haskell - 如何使用可扩展效果获得 “inflexible semantics of monad transformers”?

haskell - 为什么不是 Haskell 中 Eq 的每个类型部分?

list - 列表中的下一个元素

javascript - 无法读取未定义的属性状态

scala - 等效于 Scala 中的 Haskell do-notation 或 F# 计算表达式?

haskell - 我可以让 KnownNat n 来暗示 KnownNat (n * 3) 等吗?