Я хотел бы выразить следующий код Haskell, используя только алгебру функторов (т. е. - не полагаясь на какой-либо конкретный тип контейнера, такой как List
):
ys = zipWith (+) (head xs : repeat 0)
(tail xs ++ [y])
Мне кажется, что должен быть способ сделать это, опираясь только на Foldable
(или, может быть, Traversable
), но я его не вижу.
Я задаюсь вопросом:
- Существует ли общее понятие first и rest для функторов Foldable/Traversable?
- Существует ли общепринятый идиоматический способ, использующий только функторную алгебру, для сдвига содержимого функтора Foldable/Traversable? (Обратите внимание, что приведенное выше вычисление может быть описано на английском языке как «Сдвиг на одно значение справа и добавление значения, которое выпадает слева, к новому первому значению».)
Foldable
, но гораздо более удобный и общий:_head
и_tail
из библиотеки линз. - person leftaroundabout   schedule 11.06.2018