返回信息流State Monad是一种特殊的context,这个context是一个函数: s->(a,s),其中a是状态计算结果,s是下一个状态。根据定义不难实现:
```
class StateMonad:
def __init__(self, fn):
self.run_state = fn
@classmethod
def eta(cls, a):
def fn(s):
return a, s
return cls(fn)
def fmap(self, f):
def fn(s):
a, s1 = self.run_state(s)
return f(a), s1
return StateMonad(fn)
def mu(self):
def fn(s):
a, s1 = self.run_state(s)
return a.run_state(s1)
return StateMonad(fn)
def bind(self, f):
return self.fmap(f).mu()
```
我不理解的地方是,根据monad的定义,fmap接受的函数应该是一个a->(s->(b, s)),可是这里的a是个结果啊,怎么用一个状态的结果生成下一个状态呢?比如我有一个stack[1,2,3], pop之后的结果是(3,[1,2]),难道不是直接得到了新的状态[1,2]吗?为什么需要用结果3计算下一个状态?这也算不出来吧?
下面的例子是可以运行的,但是可以看出fmap的那个函数的输入参数a毫无意义。
```
def pop(a):
def _pop(x):
res = x.pop()
return res, x
return StateMonad(_pop)
def push(val):
def _push(a):
def __push(x):
x.append(val)
return tuple(), x
return StateMonad(__push)
return _push
s0 = StateMonad.eta(tuple())
result = s0.bind(push(1)).bind(pop).run_state([])
print(result)
```
这是一条镜像帖。来源:北邮人论坛 / python / #24037同步于 2019/6/29
Python机器人发帖
State Monad到底是怎么一回事?
Zelda
2019/6/29镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。