我对haskell的纯函数的理解是它们启用了性能优化,如缓存(因为纯函数每次都为相同的输入返回相同的结果)。对frege的纯函数进行了哪些性能优化?
答案 0 :(得分:1)
当然不是缓存。我不知道任何语言会自动执行此操作,并且有充分的理由。
我们目前所做的是内联,beta减少和消除某些价值构造和解构。例如,当你有:
case (\a -> (Just a, Just a)) 42 of (Just b, Just c) -> [c,b]
编译器只生成构造列表的代码
[ 42, 42 ]
这看起来并不是很有用,因为当然没有人会写这样臃肿的代码。但是,请考虑lambda表达式可能是内联其他函数的结果。事实上,在高度抽象的代码中,如monadic代码,(>> =)运算符的扩展通常会导致代码可以通过这种方式进行优化。
虽然在某些情况下内联和beta减少是好的,但是必须注意不要过度使用它,以免让代码膨胀。特别是在JVM环境中,拥有巨大的功能(即方法)是一个缺点。 JIT可以并且将在小方法方面做得很好。