GHC何时在内部改变不可变的值?

Mas*_*tic 3 optimization haskell real-time immutability ghc

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

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

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

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

PS这个优化是否有正式的名称?

lef*_*out 9

GHC本身并不这样做.各种容器库使用称为流融合的技巧,这意味着纯功能代码所暗示的一些副本实际上并未实现 - 但这仍然不是真正的"内部变异",而是将多个操作组合在一起,每个操作都包含一个复制到一个大的操作仍然只有一个副本.

我认为以全自动方式获得真正的"突变优化"并不可行; 一些像Mercury这样的语言声称他们这样做,但我真的不知道它有多好用.

然而,像Haskell这样的好的纯函数语言能够明确地处理可变状态:通过monad.这可能是"无所不能"的IOmonad(有点不赞成,因为你失去了所有ref-transp.保证,但对于实时应用程序这可能是正确的事情),或者是专门的STmonad,其目的是让你使用true可变状态,同时保持程序的外部行为纯粹功能.
如果你采取这种方法,你不仅要确保不会有昂贵的副本,你也可能最终得到更好的代码.因为有时突变只是思考某些问题的正确方法; 如果你在Statemonad中 "假装"使用可变状态,那么即使是真正纯粹功能的代码也会变得更好.

  • @MasterMastic:就可变状态而言,`IO`和`ST`实际上是相同的; 区别在于,`ST`不允许您执行文件读取,随机数访问等.因此,它的端到端性能是参考透明的; 因此,您可以将一个可变的"ST"算法安全地嵌入到一个纯函数的程序中(使用`runST`;当使用`IO`时,这将需要`unsafePerformIO`,我们不希望这样).但是如果你仍然在'IO` monad中,你也可以将它用于可变状态. (2认同)