【发布时间】:2015-05-21 09:36:23
【问题描述】:
我正在学习haskell,我尝试在不使用递归的情况下编写自己的反向函数。
解决方法是这个函数:
myreverse = foldl (flip (:)) []
我试图了解在评估过程中会发生什么,比如:
myreverse [1..5]
我不明白翻转在这里做什么。有人可以用分步说明写下这里发生的事情吗?
【问题讨论】:
-
我无法理解
flip在这里做了什么。 将(:)写成 lambda:\x xs -> x : xs可能会对您有所帮助。如果将flip应用于此 lambda,则生成的函数为\xs x -> x : xs。 -
protip:使用 List 模块中的
foldl'而不是foldl。普通的foldl永远不是最好的选择(除非你正在解决一些crazy made up problem) -
@hugomg,我认为在这种情况下应该没问题。
flip (:)不进行任何实际计算,因此我希望 GHC 将其视为构造函数。不过,您必须进行测试才能确定。
标签: haskell recursion foldleft