BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #24037同步于 2019/6/29
Python机器人发帖

State Monad到底是怎么一回事?

Zelda
2019/6/29镜像同步0 回复
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) ```
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。