【问题标题】:Return last n elements from lists in Haskell从 Haskell 中的列表中返回最后 n 个元素
【发布时间】:2020-11-21 23:51:50
【问题描述】:

我是 Haskell 的新手,目前正在尝试理解模式匹配。那么是否有可能从这样的列表中获取最后 3 个元素: [[1,2,3,4,5,6], [5,6,7,8,9], [10,11,12,13]] 返回类似[(4,5,6), (7,8,9), (11,12,13)] 的内容?

这是我的代码

lastElems [] = []
lastElems ((x:xs):ys) = drop (length xs - 3) xs : lastElems ys

我认为它完成了它应该做的事情,但它作为列表而不是元组中的列表返回。 谁能给我一个关于如何解决这个问题的提示?

这是否也意味着您不能将 (:) 与元组一起使用?提前致谢。

【问题讨论】:

  • drop n xs 返回一个列表,而不是一个元组。在这里使用递归可能会更好。
  • 谢谢!在这种情况下,last 的递归会以某种方式起作用吗?我知道last 只返回最后一项。但是,如果我想要不止一件商品,我该怎么办?

标签: list haskell tuples


【解决方案1】:

drop :: Int -> [a] -> [a] 接受一个Int 和一个列表[a],并返回一个[a]。这也是有道理的,因为数字是任意的,因此我们无法在编译时知道列表将包含多少元素。

然而,我们可以使用显式递归来检索最后三个元素:

last3 :: [a] -> (a, a, a)
last3 [x1, x2, x3] = (x1, x2, x3)
last3 (_:xs@(_:_:_:_)) = last3 xs

那么lastElems只是last3的映射:

lastElems :: [[a]] -> [(a, a, a)]
lastElems = map last3

这个功能当然不适用于少于三个元素的列表。

【讨论】:

  • 谢谢威廉!我必须比我想象的更早开始学习递归:)
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多