Я постараюсь описать мой мыслительный процесс, чтобы вы могли следовать. Эта функция соответствует шаблону создания списка вывода (здесь строка) из входного начального числа (здесь строка) путем повторного применения функции (здесь отбрасываются некоторые элементы). Таким образом, я выбираю реализацию с Data.List.unfoldr
.
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
Хорошо, мне нужно превратить начальное значение b
в (Maybe
) вывод a
и остальную часть строки. Я назову эту подфункцию f
и передам в unfoldr
.
printing s n = unfoldr f s
where f b = case drop n b of
[] -> Nothing
(x:xs) -> Just (x,xs)
Оказывается, что попытка убрать голову с начала списка и вернуть Maybe
также является распространенным паттерном. Это Data.List.uncons
, поэтому
printing s n = unfoldr (uncons . drop n) s
Очень гладко! Поэтому я проверяю это, и вывод неправильный! Ваш указанный вывод на самом деле, например. для n=2
выбирает каждый второй символ, т.е. пропускает (n-1)
символов.
printing s n = unfoldr (uncons . drop (n-1)) s
Я проверяю это снова, и оно соответствует желаемому результату. Уф!