遍历Haskell中的列表拆分功能

Mic*_*ael 6 haskell split list fold

这是我先前的问题的跟进。

我试图从这里了解Haskell中的列表拆分示例:

foldr (\a ~(x,y) -> (a:y,x)) ([],[])
Run Code Online (Sandbox Code Playgroud)

我可以阅读Haskell并知道是什么foldr,但不理解此代码。您能否带我看一下这段代码并对其进行更详细的说明?

bra*_*drn 5

让我们尝试在示例输入列表上运行此功能,例如[1,2,3,4,5]

  1. 我们从开始foldr (\a ~(x,y) -> (a:y,x)) ([],[]) [1,2,3,4,5]。这a是列表的第一个元素,(x,y)开头为([],[]),所以(a:y,x)返回([1],[])
  2. 输入列表的下一个元素是a = 2(x,y) = ([1],[]),所以(a:y,x) = ([2],[1])。请注意,列表的顺序已交换。每次迭代将再次交换列表。但是,输入列表的下一个元素将始终添加到第一个列表,这就是拆分的方式。
  3. 输入列表的下一个元素是a = 3(x,y) = ([2],[1]),所以(a:y,x) = ([3,1],[2])
  4. 输入列表的下一个元素是a = 4(x,y) = ([3,1],[2]),所以(a:y,x) = ([4,2],[3,1])
  5. 输入列表的下一个元素是a = 4(x,y) = ([4,2],[3,1]),所以(a:y,x) = ([5,3,1],[4,2])
  6. 没有更多的元素了,所以返回值为([5,3,1],[4,2])

如本演练所示,split函数的工作方式是维护两个列表,在每次迭代时交换它们,并将输入的每个元素附加到另一个列表中。

  • 您还可以评论一下为什么在此示例中使用了惰性模式匹配吗? (3认同)