Могут ли законы Траверсинга быть получены из того факта, что каждый Traversable также является Functor?

Я думал, почему класс типа Traversable требует как Functor, так и Foldable, а не только Foldable, так как он не использует какую-либо часть Functor?

class (Functor t, Foldable t) => Traversable t where
    traverse  :: Applicative f => (a -> f b) -> t a -> f (t b)
    sequenceA :: Applicative f => t (f a) -> f (t a)

Кажется, что законы для Traversable отсутствовали в документации для базы 4.6, что заставляет меня думать, что они могут быть получены из того факта, что каждый Traversable является Функтор?

В Суть документа с образцом итератора (раздел 5.1) в нем говорится, что для traverse существуют некоторые бесплатные теоремы, которые поступают непосредственно из его типа, но бумага не углубляется, описывая, почему это так.

Где действуют законы Traversable описанные в базовой документации 4.7?

Ответ 1

В принципе, любой конструктор типа * -> *, ковариантный в своем аргументе является канонически функтором. Так как Applicative f, очевидно, ковариантно, значит, t для сигнатуры sequenceA :: t (f a) -> f (t a) имеет смысл, поэтому требование Functor по существу является избыточным. Но, как и в случае с суперклассом с длинным отсутствием, потому что он был ненужным Applicative => Monad, это не очень хорошая идея, чтобы опустить такие "очевидные" требования, это просто приводит к дублированию кода и запутыванию синонимичных функций.