Traversable
- это в некотором смысле класс контейнеров, структура которых имеет «путь» (который может соответствовать списку), элементы которого могут быть изменены без растворения структуры. Следовательно,Каков самый стандартный/общий способ застегивания прокручиваемого списка?
zipTrav :: Traversable t => t a -> [b] -> Maybe (t (a,b))
zipTrav = evalStateT . traverse zp
where zp a = do
bs <- get
case bs of
[] -> lift Nothing
(b:bs') -> put bs' >> return (a,b)
Однако обход этого списка выглядит немного хакерским и, вероятно, не самым эффективным способом его выполнения. Я бы предположил, что будет стандартная функция, которая выполнила бы вышеупомянутую или более общую задачу, но я не могу понять, что это будет.
@WillNess Nah, вам просто нужно проверить, осталось ли что-либо в списке ввода после того, как вы закончили прохождение. Я обновлю свой код –
@WillNess Я думаю, что вопросник хочет вернуть «Ничего», если в списке недостаточно элементов, чтобы заполнить «Traversable». Идея состоит в том, чтобы сохранить форму «Traversable» при соединении каждого из значений –
ах, это имеет смысл. это означает, что ваша предыдущая версия была действительно правильной. :) Я восстановил вашу предыдущую версию и добавил поясняющий пример. Прошу прощения. –