- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一个 haskell 初学者,试图理解 StateMonad 的定义,特别是绑定(bind)操作。取自Generalising Monads to Arrows第 4 页。
instance Monad (StateMonad s) where
return a = SM (\s -> (a, s))
x >>= f = SM (\s -> let
SM x' = x
(a, s') = x' s
SM f' = f a
(b, s'') = f' s'
in (b, s''))
最佳答案
首先需要了解>>=
的类型;我假设您这样做了,因为它位于该论文的第 2 页上,并且您已经跳过了。
如果我们定义runState
,bind的定义可能会更容易理解。
newtype SM s a = SM (s -> (a, s))
runState :: SM a -> s -> (a, s)
runState (SM f) s = f s
-- this is equivalent to
-- runState (SM f) = f
runState
通过提取转换状态的函数 f
并将其应用于初始状态 s
来运行状态 monad。函数f
返回一个(a, s)
类型的元组。该元组包含依赖于状态的值(a
类型)和一个新状态(s
类型)。以下是等效的
let (a, s') = runState x s
in ...
let SM x' = x
(a, s') = x' s
in ...
这两者都提取函数x'
来了解如何从x
转换状态,然后将其应用于初始状态s
。生成的元组 (a, s')
包含状态相关值 a
和新状态 s'
。
我们可以将 >>=
定义中的 SM
模式匹配替换为 runState
。
x >>= f = SM (\s -> let
(a, s') = runState x s
(b, s'') = runState (f a) s'
in (b, s''))
现在我们将一点一点地讨论它。
Bind 使用依赖于某些初始状态 s
的函数构造一个新的 StateMonad
。它返回一个与状态相关的值b
和一个新的状态s''
:
x >>= f = SM (\s -> let
...
in (b, s''))
状态相关值a
和新状态s'
是通过使用初始状态运行状态单子(monad)
:x
来计算的>s
let
(a, s') = runState x s
新的状态单子(monad)f a
是根据用户提供的函数f
和状态相关值a
确定的。第二个状态 monad 以中间状态 s'
运行。它计算另一个状态相关值 b
和最终状态 s''
。
(b, s'') = runState (f a) s'
第二个状态相关值 b
和最终状态 s''
是为新的 StateMonad
构造的函数返回的值。
关于haskell - 理解 StateMonad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38821865/
我是一个 haskell 初学者,试图理解 StateMonad 的定义,特别是绑定(bind)操作。取自Generalising Monads to Arrows第 4 页。 instance Mo
所以,我有这个数据类型(来自这里:https://wiki.haskell.org/IO_Semantics): data IO a = Done a | PutChar Char (IO
我是一名优秀的程序员,十分优秀!