Могут ли законы Траверсинга быть получены из того факта, что каждый 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
, это не очень хорошая идея, чтобы опустить такие "очевидные" требования, это просто приводит к дублированию кода и запутыванию синонимичных функций.