Haskell语言学习笔记(60)Biapplicative

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 3
Const 5
Prelude Data.Biapplicative> bimap (+) (*) <<$>> (2,3) <<*>> (3,4)
(5,12)
Prelude Data.Biapplicative Control.Applicative> bimap (+) (*) <<$>> Const 2 <<*>> Const 3
Const 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 f
biliftA2 f g a b = bimap f g <<$>> a <<*>> b

biliftA3 :: Biapplicative w => (a -> b -> c -> d) -> (e -> f -> g -> h) -> w a e -> w b f -> w c g -> w d h
biliftA3 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
时间: 2024-11-09 03:15:21

Haskell语言学习笔记(60)Biapplicative的相关文章

Haskell语言学习笔记(64)Lens(4)

Prisms data NewTask = SimpleTask String | HarderTask String Int | CompoundTask String [NewTask] deriving (Show) makePrisms ''NewTask *Main> a ^? _SimpleTask Just "Clean" *Main> b ^? _HarderTask Just ("Clean Kitchen",15) *Main>

Haskell语言学习笔记(69)Yesod

Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安装失败) $ cabal install yesod Installed yesod-1.4.5 Hello World -- helloworld.hs {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANG

Haskell语言学习笔记(49)ByteString Text

Data.ByteString String 是 [Char] 的同义词,在使用上存在List的惰性所带来的性能问题. 在处理大型二进制文件时,可以使用 ByteString 来代替 String. ByteString 包含 Lazy 模块 Data.ByteString.Lazy 和 Strict 模块 Data.ByteString. 其中 Lazy 模块内部使用 chunks(64K数据块). Prelude> import qualified Data.ByteString.Lazy

Haskell语言学习笔记(19)File IO

关于IO Action 类型为IO t. 运算时不执行,因而没有任何效果,只有执行时才会有效果,产生副作用. 一个IO Action只有在其他IO Action中才能被执行. 类型为IO t的IO Action被执行后的结果类型为t. File IO 函数 openFile hClose

Haskell语言学习笔记(44)Lens(2)

preview, review Prelude Control.Lens> view _Left (Left "abc") "abc" Prelude Control.Lens> view _Right (Right "abc") "abc" Prelude Control.Lens> view _Just (Just "abc") "abc" Prelude Cont

Haskell语言学习笔记(55)Data.Vector

Data.Vector Construction Prelude V> import Data.Vector as V Prelude V> V.empty [] Prelude V> V.singleton 1 [1] Prelude V> V.replicate 5 1 [1,1,1,1,1] Prelude V> generate 5 (+1) [1,2,3,4,5] Prelude V> iterateN 5 (*2) 1 [1,2,4,8,16]

Haskell语言学习笔记(57)Parsec(4)

Parser 类型 data ParsecT s u m a type Parsec s u = ParsecT s u Identity type Parser = Parsec String () data ParsecT s u m a ParsecT 带四个类型参数:数据流类型 s,用户状态类型 u,底层Monad类型 m,返回类型 a. ParsecT 是一个Monad转换器. type Parsec s u = ParsecT s u Identity Parsec 类型是 Pars

Haskell语言学习笔记(58)Bifoldable

Bifoldable class Bifoldable p where bifold :: Monoid m => p m m -> m bifold = bifoldMap id id bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> p a b -> m bifoldMap f g = bifoldr (mappend . f) (mappend . g) mempty bifoldr :: (a ->

Haskell语言学习笔记(59)Bitraversable

Bitraversable class (Bifunctor t, Bifoldable t) => Bitraversable t where bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d) bitraverse f g = bisequenceA . bimap f g bisequenceA :: (Bitraversable t, Applicati