Swift编译器递归代码优化(类似于Haskell)

时间:2016-06-26 15:34:31

标签: swift haskell recursion functional-programming compiler-optimization

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编译器在编译递归函数时是否部署了这样的优化策略?

0 个答案:

没有答案