Ответ 1
Каждый допустимый Traversable f
изоморфен Normal s
для некоторого s :: Nat -> *
, где
data Normal (s :: Nat -> *) (x :: *) where -- Normal is Girard terminology
(:-) :: s n -> Vec n x -> Normal s x
data Nat = Zero | Suc Nat
data Vec (n :: Nat) (x :: *) where
Nil :: Vec Zero n
(:::) :: x -> Vec n x -> Vec (Suc n) x
но это вовсе не тривиально реализовать iso в Haskell (но это стоит пойти с полными зависимыми типами). Морально, s
вы выбираете
data {- not really -} ShapeSize (f :: * -> *) (n :: Nat) where
Sized :: pi (xs :: f ()) -> ShapeSize f (length xs)
и двух направлениях изо-раздельной и рекомбинированной формы и содержимого. Форма вещи задается как раз fmap (const ())
, а ключевым моментом является то, что длина формы f x
равна самой длине f x
.
Векторы пересекаются в смысле visit-each-once-left-right-right. Нормали проходят в точности путем сохранения формы (отсюда размер) и перемещения вектора элементов. Чтобы быть проезжаемым, нужно иметь конечное число положений элементов, расположенных в линейном порядке: изоморфизм нормального функтора точно раскрывает элементы в их линейном порядке. Соответственно, каждая структура Traversable
является (финитным) контейнером: у них есть набор фигур с размером и соответствующее понятие положения, заданное начальным отрезком натуральных чисел, строго меньшим размера.
Foldable
вещи также являются финитными, и они хранят вещи в порядке (есть разумный toList
), но они не гарантируются как Functor
s, поэтому они не имеют такого четкого представления формы. В этом смысле (смысл "контейнера", определенного моими коллегами Эбботтом, Альтенкирхом и Гани), они не обязательно допускают характеристики фигур и позиций и, следовательно, не являются контейнерами. Если вам повезет, некоторые из них могут быть контейнерами до некоторого частного. Действительно существует Foldable
, чтобы разрешить обработку таких структур, как Set
, чья внутренняя структура призвана быть секретом и, безусловно, зависит от упорядочивания информации об элементах, которые не обязательно соблюдаются посредством операций перемещения. Однако именно то, что представляет собой хорошо выполненный Foldable
, является довольно спорным вопросом: я не буду спорить с прагматическими преимуществами выбора этого дизайна библиотеки, но я мог бы пожелать более четкой спецификации.