Haskell - 来自两个列表的交替元素

Sha*_*abu 12 haskell tuples list alternating

我正在尝试编写一个haskell函数,它接受两个整数列表,并生成一个列表,其中包含从两个列表中交替获取的元素.

我有这个功能:

blend xs ys
Run Code Online (Sandbox Code Playgroud)

一个例子:

blend [1,2,3] [4,5,6]
Run Code Online (Sandbox Code Playgroud)

应该回来

[1,4,2,5,3,6]
Run Code Online (Sandbox Code Playgroud)

我的逻辑是将两个列表压缩在一起,生成备用元素对,然后以某种方式将它们从元组中删除.

它将它们从元组中删除,我无法弄清楚如何实现.

bit*_*ask 19

如何在递归 - 下降期间交换参数?

blend (x:xs) ys = x:(blend ys xs)
blend _ _ = []
Run Code Online (Sandbox Code Playgroud)

您甚至可以将此方法概括为任意数量的列表(我将留给您)或者如果另一个列表为空,则采用列表的其余元素:

blend _ ys = ys
Run Code Online (Sandbox Code Playgroud)


dfl*_*str 6

我会假设这是家庭作业.如果您可以创建以下列表(如您所述):

[(1,4),(2,5),(3,6)]
Run Code Online (Sandbox Code Playgroud)

...你可以用2个函数来解决它:

  1. 您需要将元组(a, b)转换为列表[a, b].尝试使用模式匹配!需要在列表的所有元素上应用(也就是映射)此函数.
  2. 您将拥有一个列表列表,[[1,4],[2,5],[3,6]]因此您需要一个函数将子列表连接到一个大列表中.

当然还有其他方法,可能是更好的方法来解决这个问题,但继续使用原始方法可能是一个好主意.


Lan*_*dei 5

如果要压缩,请生成列表而不是元组:

concat $ zipWith (\x y -> [x,y]) [1,2,3] [4,5,6]
Run Code Online (Sandbox Code Playgroud)

一些毫无意义的乐趣:

concat $ zipWith ((flip(:)).(:[])) [1,2,3] [4,5,6]  
Run Code Online (Sandbox Code Playgroud)

可能是最简单的方法:

import Data.List
concat $ transpose [[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)