gpt4 book ai didi

functional-programming - 函数式编程 : how far should immutability go?

转载 作者:行者123 更新时间:2023-12-04 08:41:25 26 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




我意识到这可能是一个相当主观的问题,但我正在寻找比我在函数式编程方面更有经验的人的一些见解。

我的理解是,保持一切不可变的主要动机是让事情更容易理解,并阻止错误蔓延到并行任务中。这样做的缺点是,每次您想要更改数据结构时,都必须将整个数据结构复制到一个新的对象中,但要进行所需的更改。这样做可能会产生一些性能成本:虽然我不会三思而后行,但如果您正在处理大型矩阵或张量或类似的大型数据结构,那肯定会变得非常慢?

简而言之:

  • 复制不可变数据结构是否有性能损失,影响有多大?
  • 如果是这样,您能否举例说明您(个人)将在使某些东西不可变和使其可变之间划清界限?
  • 最佳答案

    在广泛使用不变性的语言中,有机会在复制时使用“快捷方式”。副本和原件可以共享相同的结构,因为您知道它们不能在您的控制下改变,因为它们是不可变的。只需要创建更改的部分。

    From the Clojure Docs on their structures :

    All of the Clojure collections are immutable and persistent. In particular, the Clojure collections support efficient creation of 'modified' versions, by utilizing structural sharing, and make all of their performance bound guarantees for persistent use.



    (强调我的)

    基本上,如果你有一个 list
    [0 1 2]

    然后你加入(添加)它
    (conj [0 1 2] 3)

    这将创建一个在末尾添加 3 的副本。但是,因为原始和副本共享前 3 个元素,所以不需要复制整个列表。 “副本”引用原始结构的公共(public)部分,以及 3.

    你在哪里画线? UI 被证明很难仅使用不可变对象(immutable对象)。我几乎放弃了完全避免该领域的可变性。关键是将其限制在必要的地方。 99% 的函数应该包含不变性,然后将 1% 的函数处理杂乱的位(如 UI 回调代码)隐藏在某个地方。虽然这是一条学习路线,但很难正确沟通。

    如有疑问,请使其不可变。

    关于functional-programming - 函数式编程 : how far should immutability go?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47239738/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com