Swift编译器是否使用fusion来优化代码?
让我们说我们想编写代码来计算列表中所有正数的平方根的总和。在Haskell中你可以写
sumOfSquareRoots xs = sum (allSquareRoots (filterPositives xs))
where
allSquareRoots [] = []
allSquareRoots (x:xs) = sqrt x : allSquareRoots xs
filterPositives []
= []
filterPositives (x:xs)
| x > 0 = x : filterPositives xs
| otherwise = filterPositives xs
这段代码非常容易阅读(第一行非常简洁 - 几乎是英文; where
之后的部分是本地的。)这种风格还利用强大的内置函数,如{{1我们可以将其他函数公开并重用它们。所以,好风格。
但是,我们可能会担心它的效率低于一次通过功能。 (它先通过列表传递给filterPositives,然后获取allSquareRoots,最后总结一下。)然而,由于Haskell,所谓的懒惰评估执行策略,开销明显低于大多数其他语言。此外,一个好的Haskell编译器通常可以使用名为 fusion 的进程从更优雅的多遍遍版本派生出一个遍历版本。
我的问题 - Swift编译器在编译递归函数时是否部署了这样的优化策略?