我目前正在尝试共享部分应用的功能。为了使共享可见,我使用了跟踪效果。为了说明我的问题,我首先显示一个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
核心代码显示f1
和f2
都是lambda函数,而f3
和f4
是部分应用的函数。在第一种情况下,lambda主体中似乎没有共享参数,而在第二种情况下有效。启用编译器优化会导致所有定义都共享,但是我对为何lambda函数中不存在共享感兴趣。