【问题标题】:Mutability in functional programming函数式编程中的可变性
【发布时间】:2011-01-06 20:27:19
【问题描述】:

首先我是一个 Haskell 新手。 我读过这个: Immutable functional objects in highly mutable domain 我的问题几乎是一样的——如何有效地编写状态应该改变的算法。让我们以 Dijkstra 算法为例。将会找到新的路径并且应该更新距离。在传统语言中,这很简单,例如在 Haskell 中,我只能想到创建全新的距离,这将太慢且消耗内存。是否有类似设计模式的情况,应该实现具有可变数据结构的算法,并且速度和内存使用是主要关注点?

【问题讨论】:

    标签: algorithm data-structures haskell functional-programming


    【解决方案1】:

    当然,函数式语言可以通过多种方式解决这个问题。

    1. 不同的数据结构 - 许多数据结构可以以纯功能方式实现,具有与命令式版本相同的算法复杂性。这方面最著名的作品可能是 Chris Okasaki 的Purely Functional Data Structures,但也有许多其他资源。对于 Dijkstra 的算法,Martin Erwigfunctional graphs 上的工作是合适的。参见this question

    2. 不同的算法 - 一些算法内置了可变性假设,快速排序就是一个例子。在这种情况下,可以使用更适合不变性的替代算法。

    3. 可变状态 - 每种功能语言都可以使用 State monad 对功能状态进行建模。大多数还提供其他形式的可变性,例如 Haskell 的 ST monad 和 IORef。

    【讨论】:

    • 遗憾的是,对最适合惰性函数式不可变语言的数据结构和算法的研究落后于严格的命令式可变语言。 :-(
    【解决方案2】:

    ST Monad 允许您在内部使用可变状态,但呈现一个纯外部接口。

    【讨论】:

      【解决方案3】:

      创建新的不可变对象并不像您想象的那么昂贵,因为可能会发生大量的结构共享,因为编译器知道它们无法更改,因此可以安全地共享。也就是说,在 Haskell 中使用具有大量可变状态的高度命令式算法有点代码味道。

      【讨论】:

        【解决方案4】:

        在ML派生类(如OCaml、SML、F#)中,有“引用”,可以作为可变变量使用。

        在 Haskell 中,这不是干净的处理。通常的“纯功能”样式根本没有涵盖状态。纯 FP 语言处理“永恒的真理”,因此不太适合处理“短暂的真理”(尽管可以,但绝对可以)。

        但是,是的,有时我们需要可变状态。 ATS 等语言包含 linear 类型,用于处理破坏性更新和安全资源操作。

        【讨论】:

          猜你喜欢
          • 2021-05-26
          • 2018-07-16
          • 2016-04-22
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          相关资源
          最近更新 更多