gpt4 book ai didi

haskell - GHC 什么时候在内部改变不可变值?

转载 作者:行者123 更新时间:2023-12-03 16:21:07 24 4
gpt4 key购买 nike

我希望将 Haskell 用于包含不断变化的重状态的实时应用程序。

当然,状态是不可变的,因此在每个状态步骤中,我都会重新创建一个新的稍微改变的状态并丢弃旧的状态。在这种情况下,它会变得非常低效,因为我不需要之前的状态。

我经常遇到有人说 GHC 可以优化那些东西并在内部改变不可变值,我想确保它会。

是否可以?有没有办法确定 GHC 是否会通过内部变异值来优化它?有没有办法强制执行它/确保它会执行?

附言这种优化有正式的名称吗?

最佳答案

GHC 本身不会这样做。各种容器库使用一种称为流融合的技巧,这意味着纯功能代码建议的一些副本实际上从未制作过——但这仍然不是真正的“内部突变”,而是将多个操作组合在一起,每个操作都涉及一个复制到一个单一的大操作,仍然只有一个副本。

我不认为以全自动方式获得真正的“变异优化”真的可行;有些语言如 Mercury有点声称他们这样做了,但我真的不知道它的效果如何。

然而,像 Haskell 这样优秀的纯函数式语言非常有能力显式地处理可变状态:通过 monad。这可以是“万能的”IO monad(有点不赞成,因为你失去了所有 ref-transp。保证,但对于实时应用程序,这可能是正确的事情),或专门的 ST monad ,其目的特别是允许您使用真正的可变状态,同时保持程序的外部行为纯函数式。
如果您采用这种方法,您不仅可以确保不会制作成本高昂的副本,还可能最终得到更好的代码。因为有时候变异是思考问题的正确方式;如果在 State monad 中“假装”使用可变状态,即使是真正纯函数式的代码有时也会变得更好。 .

关于haskell - GHC 什么时候在内部改变不可变值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27754801/

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