gpt4 book ai didi

haskell - 共享部分应用功能

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

我目前正在尝试共享部分应用的功能。为了使共享可见,我使用了跟踪效果。为了说明我的问题,我首先展示一个 simplified example .

f1, f2, f3, f4 :: Int -> Int
f1 = \x -> trace "f1" 0 + x
f2 x = trace "f2" 0 + x
f3 = (trace "f3" 0 +)
f4 = (+) (trace "f4" 0)

我在以下场景中比较这些函数,其中 f1 被不同的函数替换。

apply :: (Int -> Int) -> (Int -> Int) -> Int
apply f g = f 42 + g 42

result = let f = f1
in apply f f

输出(未经优化编译)如下。

f1 f1 f2 f2 f3 f4 336

核心代码显示,f1f2都是lambda函数,而f3f4是部分lambda函数应用功能。在第一种情况下,lambda 体内似乎没有共享参数,而在第二种情况下则有效。启用编译器优化会导致所有定义共享,但我感兴趣的是为什么 lambda 函数内没有共享。

最佳答案

I am interested in why there is no sharing within lambda functions.

有些应用程序您确实不想想要共享。经典的例子是,如果要共享的值是一个惰性(可能是无限的)列表。然后在非共享的情况下,第一个使用站点可以以流方式处理该列表,并且垃圾收集器可以在其之后立即进行清理。然后,列表的第二个用户将需要重新进行列表构建计算,是的,但一切都发生在O(1)内存中。

通过共享,在这种情况下,您会保留对列表根的引用,因此垃圾收集器只会在第二个用户也使用该列表后启动。也许这种情况发生得很晚,在第一个用户已经将列表扩展到几千兆字节之后。一般来说,你不希望这样!因此,lambda (CAF) 提供了一种防止在这种情况下共享的方法。只有当编译器确定共享在某些情况下确实有益时,它才会优化共享。

Is sharing of monadic computations for monad instances like State possible at all?

是的...是的,但我不太明白你想分享什么以及如何分享。请澄清问题。

关于haskell - 共享部分应用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59289891/

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