gpt4 book ai didi

haskell - 独立内存论点

转载 作者:行者123 更新时间:2023-12-04 15:56:55 25 4
gpt4 key购买 nike

我有一个模拟,对 type F = A -> B -> C -> D 的函数有很多调用。 , 其中 A .. D是具体类型。
A 类型的对象有中等生命周期。 (它是 codegolf's ratrace 的基因组。)

最昂贵的计算来自参数 A .我可以像这样轻松地内存:

f1 :: F
f1 a = let expensive = trace "expensive computation!" $ expensiveComputation a
in \b c -> expensive

并持有一些预处理的 expensive通过部分应用的值:
preProz :: [B -> C -> D]
preProz = [f1 [], f1 [False], f2 []]

痕迹表明 preProz <*> [[],[[]]] <*> [1,2]不会重新计算令我高兴的值。

现在我发现我的一些 F s 将受益于预处理 B , 也。此预处理独立于 A ,而且,事实上,这样的内存并没有什么好处
f2 a = let expensive = trace "expensive computation!" $ expensiveComputation a
in \b -> let dear = trace "expensive computation!" $ expensiveComputation b
in expensive + dear

因为 dear被重新计算,甚至是 b s 相等。

我需要的是这样的:
(B -> e) -> A -> e -> C -> D

在哪里 e应该记住。 e的类型在这里有点存在感。
但这迫使我重新计算所有值 A对于每个 B ,这同样糟糕,我无法保存 e s,这是函数私有(private)的。

如何独立内存 2 个参数?

最佳答案

您需要一个能够同时记录 a 的函数和 b一起:

f12 a b = ...
in \c -> ...

当你想内存 a但不是 b , 你使用 f1 a当你想记住两者时,你可以使用 f12 a b .

f1 之间共享一些实现当然会很好。和 f12 .但是,您只能通过使用将预先计算的结果代替原始值的私有(private)函数来做到这一点:
f1 a = privateA (precomputeA a)
f12 a b = privateAB (precomputeA a) (precomputeB b)
privateA a' b = privateAB a' (precomputeB b)
private AB a' b' c = ...

如果 b 的预计算取决于 a 的预计算, 然后:
f1 a = privateA (precomputeA a)
f12 a b = let a' = precomputeA a in privateAB a' (precomputeB a' b)
privateA a' b = privateAB a' (precomputeB a' b)
private AB a' b' c = ...

我故意不使用函数组合和 eta-reduction,以使事情更清晰。我还省略了您可能想要用来控制评估时间的任何严格性注释。

也许内存在这里不是很合适的术语。您的意思是“也有一些预计算的部分应用程序”。

关于haskell - 独立内存论点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29194315/

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