【问题标题】:where does haskell save state?haskell 在哪里保存状态?
【发布时间】: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 中的“如何思考功能性”部分是否能澄清事情。简而言之,是的,您是正确的,参数用于传递变化的值,用作状态。这称为状态传递。

标签: haskell state monads


【解决方案1】:

“人们说 Haskell 没有状态。”

Haskell 确实有状态,只是大多数时候它是非常短暂的。以下面的函数为例。

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

这个函数正在抓取状态,值保存在堆栈中。仅有的两个长期值是输入列表和输出值。如果这个函数被另一个函数调用,那么即使这些值也不是长期的。

do 符号看起来像是有状态,但这只是语法糖。看起来势在必行的代码变成了一系列链接的 lambda 表达式。 Desugaring do-notation for Monads

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

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 2021-09-27
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2012-04-07
    • 2011-10-26
    相关资源
    最近更新 更多