【发布时间】:2014-04-03 15:15:00
【问题描述】:
我以为我对 Haskell Monads 掌握得很好,直到我意识到这段非常简单的代码对我来说毫无意义(来自haskell wiki about the State monad):
playGame :: String -> State GameState GameValue
playGame [] = do
(_, score) <- get
return score
让我感到困惑的是,当提供的唯一参数是字符串时,为什么允许代码调用“get”?似乎它几乎是凭空产生了价值。
我提出这个问题的一种更好的方法可能是,如何使用>>= 和 lambda's 而不是 do 表示法重写这个函数?我自己也想不通。
【问题讨论】:
-
代码不是“调用”获取。 “get”不是一个函数,它是一个多态值:hackage.haskell.org/packages/archive/transformers/latest/doc/…
-
谢谢,这对我来说实际上是一个主要的困惑点。对于来自 OO 世界的人来说,这几乎是一个不幸的名字,其中类通常具有“getThis”和“getThat”方法。我只是假设既然“get”是一个动词,它一定是一个函数。
-
即使在 OO 领域,也没有那么简单。特别是因为 OO getter 不是函数——它们实际上更接近于多态值,就像 Haskell 的 get 一样。不同之处在于 OO 语言中的 monad 将值附加到对象,而我们将值附加到具有任意语义的任意 monad。我会回答解释我的意思。
标签: haskell monads state-monad