수색…


통사론

  • bimap :: (a -> b) -> (c -> d) -> pac -> pbd
  • 먼저 :: (a -> b) -> pac -> pbc
  • 두 번째 : (b -> c) -> pab -> pac

비고

압연기 Functor 의 작동은 단일 유형 매개 변수에서 공변입니다. 만약 예를 들어, f A는 Functor ,이어서 소정 fa 및 형태의 기능 a -> b 하나는 얻을 수 fb (의 사용을 통해 fmap ).

Bifunctor두 가지 유형 매개 변수에서 공변입니다. fBifunctor 이고, 주어진 fab 과 두 개의 함수, 즉 a -> cb -> d bimap 사용하여 fcd 얻을 수 있습니다.

first int로서 간주되어야 fmap , 제 1 타입 파라미터를 통해 second int로서 fmap 제, 이상과 bimap 각각 제 1 및 제 2 타입 파라미터를 통해 두 가지 기능 covariantly 매핑으로 생각되어야한다.

Bifunctor의 일반적인 인스턴스

2 요소 튜플

(,)Bifunctor 인스턴스가있는 유형의 예입니다.

instance Bifunctor (,) where
    bimap f g (x, y) = (f x, g y)

bimap 은 한 쌍의 함수를 취하여 튜플의 각 구성 요소에 적용합니다.

bimap (+ 2) (++ "nie") (3, "john") --> (5,"johnnie")
bimap ceiling length (3.5 :: Double, "john" :: String) --> (4,4)

Either

Either 의 집 인스턴스 Bifunctor 값인지에 따라 적용하는 두 가지 기능의 하나를 선택 Left 또는 Right .

instance Bifunctor Either where
    bimap f g (Left x) = Left (f x)
    bimap f g (Right y) = Right (g y)

첫 번째 및 두 번째

첫 번째 인수에만 공변 매핑하거나 두 번째 인수 만 매핑하려는 경우 first 또는 second 를 사용해야합니다 ( bimap 대신).

first :: Bifunctor f => (a -> c) -> f a b -> f c b
first f = bimap f id

second :: Bifunctor f => (b -> d) -> f a b -> f a d
second g = bimap id g

예를 들어,

ghci> second (+ 2) (Right 40)
Right 42
ghci> second (+ 2) (Left "uh oh")
Left "uh oh"

Bifunctor의 정의

Bifunctor 는 두 가지 유형 매개 변수 ( f :: * -> * -> * )가있는 유형의 클래스이며, 둘 다 동시에 공분산 될 수 있습니다.

class Bifunctor f where
    bimap :: (a -> c) -> (b -> d) -> f a b -> f c d

bimap 은 한 쌍의 fmap 연산을 데이터 유형에 적용하는 것으로 생각할 수 있습니다.

f 형에 대한 Bifunctor 의 올바른 인스턴스는 functor 법칙 과 유사한 bifunctor 법칙을 충족해야합니다.

bimap id id = id  -- identity
bimap (f . g) (h . i) = bimap f h . bimap g i  -- composition

Bifunctor 클래스는 Data.Bifunctor 모듈에 있습니다. GHC 버전 7.10 이상인 경우이 모듈은 컴파일러와 함께 번들로 제공됩니다. 이전 버전에서는 bifunctors 패키지를 설치해야합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow