You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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}
    

关键注意点

  1. PyMonad的State构造需要传入计算函数,该函数接收当前状态,返回(结果值, 新状态)的元组,而非直接传入状态值。
  2. 函数式编程需避免原地修改数据(如list.append()),应返回新对象(如current_state['items'] + [item]),保持数据不可变性。

内容的提问来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:42:21