Что за профунктор представляет "иссушение"?

В этой статье Криса Пеннера говорится об "Увядшей оптике"; Оптика, которую можно использовать для фильтрации предметов из конструкции.

В статье для этой оптики используется следующее представление "Ван Лаарховен":

type Wither s t a b = forall f. Alternative f => (a -> f b) -> s -> f t

Большинство (если не все) оптики Ван Лаарховена имеют эквивалентное профункторное представление. Например, объектив:

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t 

Эквивалентно:

type Lens s t a b = forall p. Strong p => p a b -> p s t

Делает Witherтакже есть представительство Profuctor? И если да, то что это?

1 ответ

Решение

Крис здесь; вот мой поворот в представлении профункторной оптики:

Вот класс профунктора:

import Data.Profunctor
import Data.Profunctor.Traversing
import Control.Applicative

class (Traversing p) => Withering p where
  cull :: (forall f. Alternative f => (a -> f b) -> (s -> f t)) -> p a b -> p s t

instance Alternative f => Withering (Star f) where
  cull f (Star amb) = Star (f amb)

instance Monoid m => Withering (Forget m) where
  cull f (Forget h) = Forget (getAnnihilation . f (AltConst . Just . h))
    where
      getAnnihilation (AltConst Nothing) = mempty
      getAnnihilation (AltConst (Just m)) = m

newtype AltConst a b = AltConst (Maybe a)
  deriving stock (Eq, Ord, Show, Functor)

instance Monoid a => Applicative (AltConst a) where
  pure _ = (AltConst (Just mempty))
  (AltConst Nothing) <*> _ = (AltConst Nothing)
  _ <*> (AltConst Nothing) = (AltConst Nothing)
  (AltConst (Just a)) <*> (AltConst (Just b)) = AltConst (Just (a <> b))

instance (Semigroup a) => Semigroup (AltConst a x) where
  (AltConst Nothing) <> _ = (AltConst Nothing)
  _ <> (AltConst Nothing) = (AltConst Nothing)
  (AltConst (Just a)) <> (AltConst (Just b)) = AltConst (Just (a <> b))

instance (Monoid a) => Monoid (AltConst a x) where
  mempty = (AltConst (Just mempty))

instance Monoid m => Alternative (AltConst m) where
  empty = (AltConst Nothing)
  (AltConst Nothing) <|> a = a
  a <|> (AltConst Nothing) = a
  (AltConst (Just a)) <|> (AltConst (Just b)) = (AltConst (Just (a <> b)))

Если вас интересуют некоторые из возникающих оптических элементов, я реализовал некоторые из них здесь:

Определенно возможно, что есть другие интерпретации или, возможно, более простое представление, но на данный момент это, кажется, помогает. Если у кого-то еще есть другие идеи, я хотел бы их увидеть!

С удовольствием поговорим об этом подробнее, если у вас есть другие вопросы!

Другие вопросы по тегам