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

Haskell State函数调用方法咨询:如何执行自定义State函数?

如何运行Haskell的State Monad函数

你之前的写法错误在于没搞清楚State的本质——它是一个包装了状态转换函数的newtype,定义大概是这样:

newtype State s a = State { runState :: s -> (a, s) }

也就是说,State s a不是直接存着状态值,而是存着一个“输入初始状态,输出(返回结果, 最终状态)”的函数。你直接传State 1给addStateAndReturnResult 3是行不通的,因为后者已经是一个State Int Int类型的值,它不需要接收另一个State参数,而是需要用专门的函数来“运行”它。

正确的运行方式

首先确保导入了State模块:

import Control.Monad.State

然后根据你的需求选择下面的函数:

  1. 获取结果和最终状态:用runState
    它会返回一个元组,第一个元素是函数的返回值,第二个是最终的状态:
callIt :: (Int, Int)
callIt = runState (addStateAndReturnResult 3) 1
-- 运行结果是(4, 4):初始状态1加3得到4,函数返回的也是4
  1. 只获取返回结果:用evalState
    如果只关心函数的返回值,不需要最终状态:
callItResult :: Int
callItResult = evalState (addStateAndReturnResult 3) 1
-- 结果是4
  1. 只获取最终状态:用execState
    如果只需要运行后的状态,不关心返回值:
callItFinalState :: Int
callItFinalState = execState (addStateAndReturnResult 3) 1
-- 结果是4

为什么你的写法错了

State 1其实是构造了一个State Int a类型的值(里面的函数会忽略输入状态,直接返回某个a和1),但addStateAndReturnResult 3的类型是State Int Int——它本身就是一个State monad,不是一个接受State参数的函数,所以你不能把State 1作为参数传给它。必须用runState/evalState/execState这类函数,把初始状态传给它们,让它们去执行State里包装的转换函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:25:24