【发布时间】:2022-01-30 08:08:45
【问题描述】:
人们说 Haskell 没有状态。 我认为实用程序需要状态。哈斯克尔也是如此。 Haskell 没有保存状态的变量,haskell 是如何保存状态的呢? 我认为 haskell 在 head 中使用 lambda 变量作为 MEMORY!
someAction1 >>= \result1 ->
( someAction2 >>= \result2 ->
( someAction3 >>= \result3 -> return (somef result1 result2 result3)))
last function somef 可以通过 result1, result2, result3 得到 someAction1, someAction2, someAction3 的结果
lambda 变量(result1、result2、result3)的作用类似于 MEMORY(用于保存状态的变量)。
“Haskell 没有状态”并不意味着实际程序不需要状态概念。
lambda 代数之所以能做到和图灵完备一样,是因为 lambda 变量的作用域。因为 lambda 变量像内存一样使用,所以可以进行通用编程。
我做对了吗?
【问题讨论】:
-
我认为您将“状态”与“可变状态”混淆了。
-
如果“状态”是指变量,那么是的,Haskell 有变量,包括作用域变量和全局变量。没有人声称它没有。它们只是不可变的。它们是定义的,而不是分配的。说“Haskell 没有状态”的人的意思是 可变 状态。实际上 Haskell 有可变状态,它只需要通过某种单子接口访问。但是“普通”的非单子计算没有可变状态。
-
感谢您的评论。你说的对。我的问题是错误的.. 我的意思是.. 例如,解析器组合器不组合解析器和解析器。 (a -> parser a) 组合形式。原因是“a”用作存储每个阶段的解析结果的内存。我的意思是这个结果作为一个状态。
-
可以认为SKI combinator calculus 是一种没有变量的计算模型。所以变量可能不像你想象的那样对计算是强制性的。 Unlambda Programming Language 有计算斐波那契数的示例代码。
-
看看this answer 中的“如何思考功能性”部分是否能澄清事情。简而言之,是的,您是正确的,参数用于传递变化的值,用作状态。这称为状态传递。