Возвращает последние n элементов из списков в Haskell

#list #haskell #tuples

#Список #haskell #кортежи

Вопрос:

Я новичок в 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
 

Я думаю, что он делает то, что должен был делать, но он возвращает в виде списков в списке вместо кортежей.
Может кто-нибудь, пожалуйста, дать мне подсказку о том, как с этим справиться?

И означает ли это также, что вы не можете использовать (:) с кортежами? Заранее спасибо.

Комментарии:

1. drop n xs возвращает список, а не кортеж. Возможно, здесь было бы лучше использовать рекурсию.

2. Спасибо! Будет ли рекурсия с last каким-либо образом работать в этом случае? Я понимаю, что last возвращает только последний элемент. Но что мне делать, если мне нужно больше одного элемента?

Ответ №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 

эта функция, конечно, не работает для списков, содержащих менее трех элементов.

Комментарии:

1. Спасибо, Уиллем! Мне придется начать изучать рекурсию раньше, чем я думал 🙂