为什么国家需要一个价值?

And*_*yuk 12 monads haskell

从这个优秀的教程中了解State monad .然而,当我试图向非程序员解释时,他们有一个难以理解的问题.

如果State的目的是模拟可变内存,为什么state monad store的函数是这样的:

s -> (a, s)
Run Code Online (Sandbox Code Playgroud)

而不是简单地:

s -> s
Run Code Online (Sandbox Code Playgroud)

换句话说,对"中间"价值的需求是什么?例如,在我们需要的情况下,我们不能通过简单地将状态定义为元组来模拟它(state, value)吗?

我确定我感到困惑,任何帮助都表示赞赏.

Rom*_*aka 17

与C等命令式语言并行绘制,s -> s对应于具有返回类型的函数,该函数void纯粹用于副作用(例如改变内存).它是同构的State s ().

实际上,可以编写仅通过全局变量进行通信的C函数.但是,与在C中一样,从函数返回值通常很方便.这a是为了什么.

当然,对于您的特定问题,可能s -> s是更好的选择.虽然它不是Monad,但它是Monoid(当用Endo包装时).所以,你可以使用构建这样的功能<>mempty,对应于>>=return单子.


Cla*_*diu 5

为了扩展尼克的回答:

s是国家.如果所有函数都是s -> s(状态到状态),则函数将无法返回任何值.您可以将状态定义为(the actual state, value returned),但是将状态与状态函数计算的值混合在一起.而且你也希望函数能够实际计算并返回值,这也是常见的情况......