Библиотека 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
Это допустимый аппликативный экземпляр?