我在试着理解haskell,我真的不能确信这行代码是做什么的,有人能给我详细解释一下这行代码吗?为什么foldl需要遍历xs列表两次?该代码是用于冒泡排序算法的。
burbuja xs = foldl (\acc _ -> bsort acc) xs xs
at0kjp5o1#
它不会在列表上运行两次,foldl (\x -> f x) xs xs实际上是一种“鬼鬼祟祟”的方式,它应该对xs中的项目重复多次。实际上,foldl f ys (x:xs)等价于foldl f (f ys x) xs,因此这是一种将f应用于以ys开始并使用列表x的第一项的累加器的机制。但在这里,清单上的项目被删除了。因此,对于具有 n 个项目的列表xs,它将工作为:
foldl (\x -> f x) xs xs
xs
foldl f ys (x:xs)
foldl f (f ys x) xs
f
ys
x
bsort (bsort ((… (bsort xs) …))
其中它因此再次对先前的bsort的结果应用bsort函数多次,因为列表中存在元素。
bsort
1条答案
按热度按时间at0kjp5o1#
它不会在列表上运行两次,
foldl (\x -> f x) xs xs
实际上是一种“鬼鬼祟祟”的方式,它应该对xs
中的项目重复多次。实际上,
foldl f ys (x:xs)
等价于foldl f (f ys x) xs
,因此这是一种将f
应用于以ys
开始并使用列表x
的第一项的累加器的机制。但在这里,清单上的项目被删除了。因此,对于具有 n 个项目的列表
xs
,它将工作为:其中它因此再次对先前的
bsort
的结果应用bsort
函数多次,因为列表中存在元素。