如何从PyMonad的State实例(finale/user_state)中获取状态与值?
PyMonad State 状态与值的获取方法
先修正代码中的问题,确保符合函数式编程无副作用原则,同时正确使用PyMonad的State:
from pymonad.tools import curry from pymonad.state import State user_init = {'items': [], 'money': 2000} items = { 'apples': 70, 'wine': 300, 'milk': 80, 'chips': 100 } # 正确初始化State:传入计算函数,返回初始状态与初始值(这里初始值设为None) user_state = State(lambda state: (None, state)) @curry(2) def buy(item, _): @State def count_computation(current_state): # 避免原地修改,创建新的items列表和money值 new_items = current_state['items'] + [item] new_money = current_state['money'] - items[item] # 返回(本次购买的物品, 新状态) return item, {'items': new_items, 'money': new_money} return count_computation # 链式调用购买操作 finale = user_state.then(buy('wine')).then(buy('apples')).then(buy('chips')).then(buy('chips')).then(buy('milk'))
获取状态与值的三种方式
同时获取结果和最终状态:使用
.run()方法传入初始状态,返回(结果值, 最终状态)元组last_purchased, final_state = finale.run(user_init) print("最后一次购买物品:", last_purchased) # 输出: milk print("最终用户状态:", final_state) # 输出: {'items': ['wine', 'apples', 'chips', 'chips', 'milk'], 'money': 1450}仅获取最终结果值:使用
.eval()方法final_result = finale.eval(user_init) print("最终结果值:", final_result) # 输出: milk仅获取最终状态:使用
.exec()方法final_state_only = finale.exec(user_init) print("最终状态:", final_state_only) # 输出: {'items': ['wine', 'apples', 'chips', 'chips', 'milk'], 'money': 1450}
关键注意点
- PyMonad的State构造需要传入计算函数,该函数接收当前状态,返回
(结果值, 新状态)的元组,而非直接传入状态值。 - 函数式编程需避免原地修改数据(如
list.append()),应返回新对象(如current_state['items'] + [item]),保持数据不可变性。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

