Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我是否可以期望 Haskell 编译器足够聪明以优化以下定义:
h x y = p (m x) (n y)
变成这样的东西:
h x = let z = m x in \y -> p z (n y)
? m如果评估成本很高,这可能会很方便,并且我h以下列方式使用 's 定义:
m
h
main = print $ map (h 2) hugeList
但是,如果m评估成本低,但结果存储成本高怎么办?说m x = [x .. ]并p需要遍历该列表的不同前缀,具体取决于n y. 如果 thenm 2被共享map (h 2) hugeList,并且任何列表元素都需要一个长前缀,那么即使所有后续元素只需要列表的第一个元素来返回结果,您也会需要大量内存。
m x = [x .. ]
p
n y
m 2
map (h 2) hugeList
所以自动共享m x也可能是一种悲观,因此您不应该期望所有编译器都会自动共享它。
m x
通常,编译器很难决定共享是有益还是有害,因此您应该在您真正需要的地方明确共享。(尽管如此,期望编译器引入共享,即使您有时不想要它。)