gpt4 book ai didi

haskell - 在功能程序中优化使用中间结果

转载 作者:行者123 更新时间:2023-12-03 17:22:44 26 4
gpt4 key购买 nike

假设我有两个计算可以使用相同的中间结果。如果我编写了一个命令式程序,我会将相同的(相对的)“全局”状态传递给两个函数,以提高效率。

在编写函数式代码时,我会使用一个计算中间值的函数作为两个需要该值的函数的一部分。我应该期待我的编译器优化该函数调用,还是有更智能的方法让我设计程序?

为了澄清,这里有一个例子。

假设我有一个函数来计算某些属性 a经过漫长而乏味的计算。来自 a ,我需要计算另外两个属性bc .例如:b = a^2c = a^7 + a^(1/7) .现在,作为我的主程序的一部分,我调用函数来计算 bc .将计算找到a只执行一次,结果将被重用,或者将a被计算多次?

Ps:如果相关,我正在学习Haskell。

最佳答案

Suppose I have two computations which could use the same intermediate result. If I wrote an imperative program, I would pass the same (relatively) "global" state to both functions, to be more efficient.

When writing functional code, I would use a function that computes the intermediate value as part of both functions which need that value. Should I be expecting my compiler to optimize that function call, or is there a more intelligent way for me to design the program?


所以具体来说,你有两个函数,它们都计算相同的东西作为子计算的一部分。例如。
f x = y + 3
where
y = x ^ 2

g x = y * 7
where
y = x ^ 2

z = f 2 + g 2
所以你想“浮出”公共(public)子表达式 x ^ 2 ,并分享。
这是 "common subexpression elimination" .这是编译器可以执行的优化,或者您可以手动执行的操作。 GHC,一个 Haskell 编译器, will do CSE in some cases .在其他情况下,您可以通过显式命名中间计算来手动完成。
当编译器执行它时会更好。

关于haskell - 在功能程序中优化使用中间结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25474266/

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