Mic*_*ael 6 haskell split list fold
这是我先前的问题的跟进。
我试图从这里了解Haskell中的列表拆分示例:
foldr (\a ~(x,y) -> (a:y,x)) ([],[])
Run Code Online (Sandbox Code Playgroud)
我可以阅读Haskell并知道是什么foldr,但不理解此代码。您能否带我看一下这段代码并对其进行更详细的说明?
让我们尝试在示例输入列表上运行此功能,例如[1,2,3,4,5]:
foldr (\a ~(x,y) -> (a:y,x)) ([],[]) [1,2,3,4,5]。这a是列表的第一个元素,(x,y)开头为([],[]),所以(a:y,x)返回([1],[])。a = 2和(x,y) = ([1],[]),所以(a:y,x) = ([2],[1])。请注意,列表的顺序已交换。每次迭代将再次交换列表。但是,输入列表的下一个元素将始终添加到第一个列表,这就是拆分的方式。a = 3和(x,y) = ([2],[1]),所以(a:y,x) = ([3,1],[2])。a = 4和(x,y) = ([3,1],[2]),所以(a:y,x) = ([4,2],[3,1])。a = 4和(x,y) = ([4,2],[3,1]),所以(a:y,x) = ([5,3,1],[4,2])。([5,3,1],[4,2])。如本演练所示,split函数的工作方式是维护两个列表,在每次迭代时交换它们,并将输入的每个元素附加到另一个列表中。