Чтение Красивое складывание Я понял, что любой Foldable
можно превратить в Functor
, обернув его в
data Store f a b = Store (f a) (a -> b)
с помощью простого интеллектуального конструктора:
store :: f a -> Store f a a
store x = Store x id
(Это всего лишь вариант типа данных Store comonad.)
Теперь мы можем определить
instance Functor (Store f a) where
fmap f (Store x g) = Store x (f . g)
instance (F.Foldable f) => F.Foldable (Store f a) where
foldr f z (Store x g) = F.foldr (f . g) z x
Таким образом, мы можем сделать обаData.Set.Set
и Sjoerd Visscher's Weird
функтор.(Однако, поскольку структура не запоминает свои значения, многократное сворачивание может оказаться очень неэффективным, если функция, которую мы использовали в fmap
, является сложной.)
Обновление: Это также дает пример структуры, которая является функтором, складываемым, но не проходимым.Чтобы сделать Store
проходимым, нам нужно сделать (->) r
проходимым.Поэтому нам нужно реализовать
sequenceA :: Applicative f => (r -> (f a)) -> f (r -> a)
Давайте возьмем Either b
для f
.Тогда нам нужно реализовать
sequenceA' :: (r -> Either b a) -> Either b (r -> a)
Очевидно, что такой функции нет (вы можете проверить с помощью Djinn ).Таким образом, мы не можем ни понять, sequenceA
.