標籤:control instance 類型 map class flip 學習 應用 ica
Biapplicative
class Bifunctor p => Biapplicative p where bipure :: a -> b -> p a b (<<*>>) :: p (a -> b) (c -> d) -> p a c -> p b d (*>>) :: p a b -> p c d -> p c d a *>> b = bimap (const id) (const id) <<$>> a <<*>> b (<<*) :: p a b -> p c d -> p a b a <<* b = bimap const const <<$>> a <<*>> b(<<$>>) :: (a -> b) -> a -> b(<<$>>) = id
Biapplicative 是個類型類。主要用於在二中繼資料結構上應用 Applicative。
(,) 是個 Biapplicative
instance Biapplicative (,) where bipure = (,) (f, g) <<*>> (a, b) = (f a, g b)
Const 是個 Biapplicative
instance Biapplicative Const where bipure a _ = Const a Const f <<*>> Const x = Const (f x)
應用 Biapplicative
Prelude Data.Biapplicative> ((+2),(*3)) <<*>> (3,4)(5,12)Prelude Data.Biapplicative Control.Applicative> Const (+2) <<*>> Const 3Const 5Prelude Data.Biapplicative> bimap (+) (*) <<$>> (2,3) <<*>> (3,4)(5,12)Prelude Data.Biapplicative Control.Applicative> bimap (+) (*) <<$>> Const 2 <<*>> Const 3Const 5
(<<**>>), biliftA2, biliftA3
(<<**>>) :: Biapplicative p => p a c -> p (a -> b) (c -> d) -> p b d(<<**>>) = biliftA2 (flip id) (flip id)biliftA2 :: Biapplicative w => (a -> b -> c) -> (d -> e -> f) -> w a d -> w b e -> w c fbiliftA2 f g a b = bimap f g <<$>> a <<*>> bbiliftA3 :: Biapplicative w => (a -> b -> c -> d) -> (e -> f -> g -> h) -> w a e -> w b f -> w c g -> w d hbiliftA3 f g a b c = bimap f g <<$>> a <<*>> b <<*>> c
Prelude Data.Biapplicative> (2,3) <<**>> ((2^), (3*))(4,9)Prelude Data.Biapplicative> biliftA2 (+) (*) (2,3) (4,5)(6,15)Prelude Data.Biapplicative Control.Applicative> biliftA2 (+) (*) (Const 2) (Const 3)Const 5
Haskell語言學習筆記(60)Biapplicative