Из здесь класс Traversable
Functor
и Foldable
, и должны соответствовать законам:
И Foldable
дополнительные сведения см. здесь. Это означает, что его можно сложить (foldMap, foldr, foldl ...)
traverse
функция должна удовлетворять законам:
естественность:
т. traverse f = traverse (t. f) для каждого аппликативного преобразования t
личность
пройти Идентичность = Идентичность
состав
traverse (Compose. fmap g. f) = Составить. fmap (ход g). траверс f
и последовательность A:
естественность
т. последовательностьA = последовательностьA. fmap t для каждого аппликативного преобразования t
личность
последовательность А. fmap Identity = Идентичность
состав
последовательность А. fmap Compose = Составить. Последовательность fmap A. последовательностьА
Какой факт использует sequenceA: t является типом Functor, t является типом Foldable или и тем, и другим?
Traversable
, как говорится в его определении (и в приведенных выше законах):
class (Functor t, Foldable t) => Traversable t where
является как Functor
, так и Foldable, по законам, которым он должен подчиняться, это не только Functor
, он более конкретен, чем Functor
(но все же Functor, потому что удовлетворяет законам Functor и может использовать функции своего интерфейса класса типов ), и даже более конкретный, чем Foldable
, следовательно, мощный, менее общий, с большим количеством ограничений.
А что на самом деле? Определение, но почему дизайнер Traversable
выбрал именно эти два? Потому что это полезно, как вы можете видеть в ответе @Daniel Wagner. Другие примеры:
instance Traversable [] where
traverse f = List.foldr cons_f (pure [])
where cons_f x ys = liftA2 (:) (f x) ys
этот использует foldr
instance Foldable [] where
elem = List.elem
foldl = List.foldl
foldl' = List.foldl'
foldl1 = List.foldl1
foldr = List.foldr
foldr1 = List.foldr1
length = List.length
maximum = List.maximum
minimum = List.minimum
null = List.null
product = List.product
sum = List.sum
toList = id
Итак, Traverse
- это Functor
и Foldable
, поэтому вы можете использовать функции его интерфейса при необходимости. (как в примере, это просто пример, а не обоснование того, почему дизайнер решил определить Traversable
с Functor
и Foldable
), потому что это полезно.
person
Damián Rafael Lattenero
schedule
30.07.2019