获得列表中元素的偶数和奇数位置 - Haskell Mutual Recursion

Ars*_*oni 6 recursion haskell functional-programming mutual-recursion

我最近开始学习Haskell.

我在网上找到了这个代码,它返回列表所有偶数/奇数位置的元素.

它利用了相互递归,但我似乎无法理解它是如何在内部工作的.

evens (x:xs) = x:odds xs
evens _ = []

odds (_:xs) = evens xs
odds _ = []
Run Code Online (Sandbox Code Playgroud)

特别是,我不明白该清单如何向前推进并评估所有要素.即使没有明确的索引检查,它如何检查偶数位置

有人能够提供洞察力吗?

Reg*_*rtz 6

首先,让我们就某事达成一致:我们大多数时候都使用0指数,对吧?所以,如果我问你列表中第2位的元素是什么

a : b : c : d : []
Run Code Online (Sandbox Code Playgroud)

你会回答c.编辑:如果您不熟悉Haskell表示法,:则是列表构造函数,并a : b表示通过a在列表前添加前缀而生成的列表b.

继续前进到元素在偶数位置,a并且c将是显而易见的答案,而bd将是奇怪的位置.让我们来看看它的定义even.

evens (x:xs) = x:odds xs
evens [] = []
Run Code Online (Sandbox Code Playgroud)
  • 基本情况很简单:空列表中的偶数位置没有元素

  • 归纳案例说明位置0(x)中的元素处于偶数位置 - 它是 - 并且它还表示列表(x:xs)中偶数位置的所有其他元素都位于列表中的奇数位置xs.实际上,列表中位置2中的元素位于列表(x:xs)中的位置1中xs,位置4中位于位置3中的元素,依此类推;等等; 那有意义吗?

使用相同的推理,列表中奇数位置的(x:xs)元素是列表中偶数位置的元素xs,这正是odds上面的定义.