Movatterモバイル変換


[0]ホーム

URL:


{-# LANGUAGE Safe #-}{-# LANGUAGE CPP #-}------------------------------------------------------------------------------- |-- Module      :  Data.Bifunctor-- Copyright   :  (C) 2008-2014 Edward Kmett,-- License     :  BSD-style (see the file LICENSE)---- Maintainer  :  libraries@haskell.org-- Stability   :  provisional-- Portability :  portable---- @since 4.8.0.0----------------------------------------------------------------------------moduleData.Bifunctor(Bifunctor(..))whereimportControl.Applicative(Const(..))importGHC.Generics(K1(..))-- | A bifunctor is a type constructor that takes-- two type arguments and is a functor in /both/ arguments. That-- is, unlike with 'Functor', a type constructor such as 'Either'-- does not need to be partially applied for a 'Bifunctor'-- instance, and the methods in this class permit mapping-- functions over the 'Left' value or the 'Right' value,-- or both at the same time.---- Formally, the class 'Bifunctor' represents a bifunctor-- from @Hask@ -> @Hask@.---- Intuitively it is a bifunctor where both the first and second-- arguments are covariant.---- You can define a 'Bifunctor' by either defining 'bimap' or by-- defining both 'first' and 'second'.---- If you supply 'bimap', you should ensure that:---- @'bimap' 'id' 'id' ≡ 'id'@---- If you supply 'first' and 'second', ensure:---- @-- 'first' 'id' ≡ 'id'-- 'second' 'id' ≡ 'id'-- @---- If you supply both, you should also ensure:---- @'bimap' f g ≡ 'first' f '.' 'second' g@---- These ensure by parametricity:---- @-- 'bimap'  (f '.' g) (h '.' i) ≡ 'bimap' f h '.' 'bimap' g i-- 'first'  (f '.' g) ≡ 'first'  f '.' 'first'  g-- 'second' (f '.' g) ≡ 'second' f '.' 'second' g-- @---- @since 4.8.0.0classBifunctorpwhere{-# MINIMALbimap|first,second#-}-- | Map over both arguments at the same time.---- @'bimap' f g ≡ 'first' f '.' 'second' g@---- ==== __Examples__-- >>> bimap toUpper (+1) ('j', 3)-- ('J',4)---- >>> bimap toUpper (+1) (Left 'j')-- Left 'J'---- >>> bimap toUpper (+1) (Right 3)-- Right 4bimap::(a->b)->(c->d)->pac->pbdbimapfg=firstf.secondg-- | Map covariantly over the first argument.---- @'first' f ≡ 'bimap' f 'id'@---- ==== __Examples__-- >>> first toUpper ('j', 3)-- ('J',3)---- >>> first toUpper (Left 'j')-- Left 'J'first::(a->b)->pac->pbcfirstf=bimapfid-- | Map covariantly over the second argument.---- @'second' ≡ 'bimap' 'id'@---- ==== __Examples__-- >>> second (+1) ('j', 3)-- ('j',4)---- >>> second (+1) (Right 3)-- Right 4second::(b->c)->pab->pacsecond=bimapid-- | @since 4.8.0.0instanceBifunctor(,)wherebimapfg~(a,b)=(fa,gb)-- | @since 4.8.0.0instanceBifunctor((,,)x1)wherebimapfg~(x1,a,b)=(x1,fa,gb)-- | @since 4.8.0.0instanceBifunctor((,,,)x1x2)wherebimapfg~(x1,x2,a,b)=(x1,x2,fa,gb)-- | @since 4.8.0.0instanceBifunctor((,,,,)x1x2x3)wherebimapfg~(x1,x2,x3,a,b)=(x1,x2,x3,fa,gb)-- | @since 4.8.0.0instanceBifunctor((,,,,,)x1x2x3x4)wherebimapfg~(x1,x2,x3,x4,a,b)=(x1,x2,x3,x4,fa,gb)-- | @since 4.8.0.0instanceBifunctor((,,,,,,)x1x2x3x4x5)wherebimapfg~(x1,x2,x3,x4,x5,a,b)=(x1,x2,x3,x4,x5,fa,gb)-- | @since 4.8.0.0instanceBifunctorEitherwherebimapf_(Lefta)=Left(fa)bimap_g(Rightb)=Right(gb)-- | @since 4.8.0.0instanceBifunctorConstwherebimapf_(Consta)=Const(fa)-- | @since 4.9.0.0instanceBifunctor(K1i)wherebimapf_(K1c)=K1(fc)

[8]ページ先頭

©2009-2025 Movatter.jp