【问题标题】:Haskell pairing elements of a single listHaskell 对单个列表的元素进行配对
【发布时间】:2021-03-31 00:39:37
【问题描述】:

有没有办法像这样在单个列表中配对元素:

[cat,dog,bird,rabbit] 更改为[(cat,dog),(bird,rabbit)]

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

【问题讨论】:

  • 如果你传递的列表有奇数个元素,你的函数应该怎么做?

标签: list haskell tuples


【解决方案1】:

使用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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 2015-07-20
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多