HaskellData.Bifunctor
は基本的に次のとおりです。
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
私も見つけることができBiapply
ました。私の質問は、なぜ次のような完全な二重階層(bierarchy?)がないのかということです。
class Bifunctor f => Biapplicative f where
bipure :: a -> b -> f a b
biap :: f (a -> b) (c -> d) -> f a c -> f b d
class Biapplicative m => Bimonad m where
bibind :: m a b -> (a -> b -> m c d) -> m c d
bireturn :: a -> b -> m a b
bireturn = bipure
bilift :: Biapplicative f => (a -> b) -> (c -> d) -> f a c -> f b d
bilift f g = biap $ bipure f g
bilift2 :: Biapplicative f => (a -> b -> c) -> (x -> y -> z) -> f a x -> f b y -> f c z
bilift2 f g = biap . biap (bipure f g)
ペアはこれらのインスタンスです:
instance Bifunctor (,) where
bimap f g (x,y) = (f x, g y)
instance Biapplicative (,) where
bipure x y = (x,y)
biap (f,g) (x,y) = (f x, g y)
instance Bimonad (,) where
bibind (x,y) f = f x y
そしてのようなタイプ...
data Maybe2 a b = Fst a | Snd b | None
--or
data Or a b = Both a b | This a | That b | Nope
...IMOにもインスタンスがありますか。
一致するタイプが十分ではありませんか?それとも私のコードに関する何かがひどく欠陥がありますか?