List 单个列表的Haskell配对元素

List 单个列表的Haskell配对元素,list,haskell,tuples,List,Haskell,Tuples,有没有一种方法可以将元素配对到一个列表中,如下所示: 将[猫,狗,鸟,兔]更改为[(猫,狗,(鸟,兔)] 我知道zip功能,但它结合了两个列表,如何为一个列表执行此操作?使用zip的一种可能方法是将列表中的偶数位置元素与奇数位置元素列表压缩: takeEveryN :: Int -> [a] -> [a] takeEveryN _ [] = [] takeEveryN n (x:xs) = x : takeEveryN n (drop (n - 1) xs) zipList ::

有没有一种方法可以将元素配对到一个列表中,如下所示:

[猫,狗,鸟,兔]
更改为
[(猫,狗,(鸟,兔)]


我知道
zip
功能,但它结合了两个列表,如何为一个列表执行此操作?

使用
zip
的一种可能方法是将列表中的偶数位置元素与奇数位置元素列表压缩:

takeEveryN :: Int -> [a] -> [a]
takeEveryN _ [] = []
takeEveryN n (x:xs) = x : takeEveryN n (drop (n - 1) xs)

zipList :: [a] -> [(a, a)]
zipList xs = zip (takeEveryN 2 xs) (takeEveryN 2 (drop 1 xs))

如果您传递的列表包含奇数个元素,您的函数应该怎么做?请不要使用
tail
,而是使用
drop 1
。)
tail
将在空列表中出错,
drop 1
不会。对于您的其他问题,您可以将此答案与
zipWith f
一起使用,而不是
zip