Есть ли встроенная функция для получения всех последовательных подпоследовательностей размера n списка в Haskell?
Например, мне нужна функция:
gather :: Int -> [a] -> [[a]] gather n list = ???
где gather 3 "Hello!" == ["Hel","ell","llo","ol!"]
gather 3 "Hello!" == ["Hel","ell","llo","ol!"]
.
У меня есть рабочая реализация:
- Что делает ключевое слово `forall` в Haskell / GHC?
- Scala: Как определить «общие» параметры функции?
- Как преобразовать список в кортеж в Haskell?
- Как определить применение Lisp в Haskell?
- Возможно ли программирование графического интерфейса?
gather :: Int-> [a] -> [[a]] gather n list = unfoldr (\x -> if fst x + n > length (snd x) then Nothing else Just (take n (drop (fst x) (snd x)), (fst x + 1, snd x))) (0, list)
но мне интересно, есть ли что-то уже встроенное в язык для этого? Я просмотрел Data.List, но ничего не видел.
- Почему длина возвращает 1 для кортежа с 2 элементами и дает ошибку для кортежа с большим количеством элементов?
- Настройка Eclipse для компиляции Haskell с плагином EclipseFP
- Как группировать похожие элементы в списке с помощью Haskell?
- Currying 3 Аргументы в Haskell
- DatatypeContexts Устарела в последнем GHC: Почему?
- Почему 3 и x (которые были назначены 3) имеют разные предполагаемые типы в Haskell?
- Разбиение списка в список возможных кортежей
- Заявки сочиняют, монады не делают
Вы можете использовать tails
:
gather nl = filter ((== n) . length) $ map (take n) $ tails l
или используя takeWhile
вместо filter
:
gather nl = takeWhile ((== n) . length) $ map (take n) $ tails l
EDIT: вы можете удалить шаг фильтра, отбросив последние n
элементов списка, возвращаемого из tails
как это предлагается в комментариях:
gather n = map (take n) . dropLast n . tails where dropLast n xs = zipWith const xs (drop n xs)
Падение хвостов может быть организовано автоматически, благодаря свойствам застежки ,
import Data.List (tails) g :: Int -> [a] -> [[a]] gn = foldr (zipWith (:)) (repeat []) . take n . tails
или просто transpose . take n . tails
transpose . take n . tails
transpose . take n . tails
было бы достаточно. Тестирование:
Prelude Data.List> g 3 [1..10]
[[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8], [ 7,8,9], [8,9,10]]
Prelude Data.List> транспонировать. возьмите 3. хвосты $ [1..10]
[[1,2,3], [2,3,4], [3,4,5], [4,5,6], [5,6,7], [6,7,8], [ 7,8,9], [8,9,10], [9,10], [10]]