Haskell 保存状态的位置在哪里?

3

人们说Haskell没有状态。 我认为实际的程序需要状态,Haskell也不例外。 Haskell没有用于保存状态的变量,那么Haskell是如何保存状态的呢? 我认为Haskell使用头部的lambda变量作为内存!

    someAction1 >>= \result1 ->
  ( someAction2 >>= \result2 ->
  ( someAction3 >>= \result3 -> return (somef result1 result2 result3)))

somef函数可以通过result1、result2和result3获得someAction1、someAction2和someAction3的结果。

lambda变量(result1、result2和result3)起到类似于内存(用于保存状态的变量)的作用。

“Haskell没有状态”并不意味着它在实际编程中不需要状态概念。

lambda代数之所以能够像图灵完备一样完成相同的事情,是因为lambda变量的作用范围。由于lambda变量被用作内存,通用编程是可行的。

我理解得对吗?


9
我认为你把“状态”和“可变状态”混淆了。 - n. m.
6
如果你说的“state”指的是变量,那么是的,Haskell有变量,包括有作用域和全局的变量。没有人声称它没有变量。只是这些变量不可变,而是被定义而非赋值。那些声称“Haskell没有状态”意味着可变状态的人,实际上Haskell有可变状态,只是需要通过某种单子界面进行访问。但是“普通”的非单子计算没有可变状态。 - n. m.
2
谢谢您的评论。您是正确的。我的问题是错误的。我的意思是,例如,parsec组合器不会将解析器和解析器组合起来,而是将(a -> parser a)形式组合起来。原因是“a”被用作存储每个阶段解析结果的内存。我将这个结果称为状态。 - Lionhairdino L.
4
SKI组合子演算法可以被视为没有变量的计算模型,因此计算可能并不像您想象的那样需要变量。 Unlambda编程语言有用于计算斐波那契数列的示例代码。 - Micha Wiedenmann
1
请查看此答案中的“如何思考函数式编程”部分,看看是否能够澄清问题。简而言之,是的,你是正确的,参数用于传递变化的值,被用作状态。这被称为状态传递。 - Will Ness
显示剩余2条评论
1个回答

4

人们说Haskell没有状态。

Haskell确实有状态,只是大多数时候状态非常短暂。例如,考虑以下函数。

mysum :: [Integer] -> Integer
mysum [] = 0
mysum (x:xs) = x + mysum xs

此函数带有状态,其值存储在堆栈上,只有输入列表和输出值是长期保留的两个值。如果此函数由另一个函数调用,则甚至这些值也不是长期的。

do 符号看起来具有状态,但这只是语法糖。看起来命令式的代码被转换为一系列链接的 lambda 表达式。解糖 do-notation for Monads

当需要长期状态时,可以将其存储在 State Monad 或数据库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接