5

我是否可以期望 Haskell 编译器足够聪明以优化以下定义:

h x y = p (m x) (n y)

变成这样的东西:

h x = let z = m x in \y -> p z (n y)

? m如果评估成本很高,这可能会很方便,并且我h以下列方式使用 's 定义:

main = print $ map (h 2) hugeList
4

1 回答 1

8

但是,如果m评估成本低,但结果存储成本高怎么办?说m x = [x .. ]p需要遍历该列表的不同前缀,具体取决于n y. 如果 thenm 2被共享map (h 2) hugeList,并且任何列表元素都需要一个长前缀,那么即使所有后续元素只需要列表的第一个元素来返回结果,您也会需要大量内存。

所以自动共享m x也可能是一种悲观,因此您不应该期望所有编译器都会自动共享它。

通常,编译器很难决定共享是有益还是有害,因此您应该在您真正需要的地方明确共享。(尽管如此,期望编译器引入共享,即使您有时不想要它。)

于 2012-11-06T13:46:01.207 回答