Является ли Бифф аппликативом? - PullRequest
3 голосов
/ 20 июня 2020

Библиотека bifunctors предоставляет следующий тип данных:

newtype Biff p f g a b = Biff { runBiff :: p (f a) (g b) }

Как видно из библиотеки, Biff p f g a - это Functor, если p - это Bifunctor и g - это Functor.

instance (Bifunctor p, Functor g) => Functor (Biff p f g a) where
  fmap f = Biff . second (fmap f) . runBiff
  {-# INLINE fmap #-}

Я подозреваю (но не доказал), что это также случай, когда Biff Either f g a является аппликативным функтором, если:

  • f - это Alternative функтор
  • g - Applicative функтор

Вот соответствующий тетрис типа:

instance (Alternative f, Applicative g) => Applicative (Biff Either f g a)
  where
  pure a = Biff $ Right $ pure a
  Biff f <*> Biff v = Biff $ go f v
    where
    go (Left  x) (Right _) = Left x
    go (Right _) (Left  x) = Left x
    go (Left  x) (Left  y) = Left $ x <|> y
    go (Right x) (Right y) = Right $ x <*> y

Это допустимый аппликативный экземпляр?

1 Ответ

2 голосов
/ 20 июня 2020

Другими словами, Biff Either f g a - это композиция двух аппликативных функторов Either (f a) и g, которая, следовательно, является аппликативным функтором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...