Data.Functor
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимая |
| Safe Haskell | Надежная |
| Язык | Haskell2010 |
Описание
Тип f является Functor, если он предоставляет функцию fmap, которая, учитывая любые типы a и b, позволяет применить любую функцию типа (a -> b) для преобразования f a в f b, сохраняя структуру f.
Примеры
>>> fmap show (Just 1) -- (a -> b) -> f a -> f b Just "1" -- (Int -> String) -> Maybe Int -> Maybe String
>>> fmap show Nothing -- (a -> b) -> f a -> f b Nothing -- (Int -> String) -> Maybe Int -> Maybe String
>>> fmap show [1,2,3] -- (a -> b) -> f a -> f b ["1", "2", "3"] -- (Int -> String) -> [Int] -> [String]
>>> fmap show [] -- (a -> b) -> f a -> f b [] -- (Int -> String) -> [Int] -> [String]
Функция fmap также доступна как инфиксный оператор <$>:
>>> fmap show (Just 1) -- (Int -> String) -> Maybe Int -> Maybe String Just "1" >>> show <$> (Just 1) -- (Int -> String) -> Maybe Int -> Maybe String Just "1"
class Functor f where Источник
Тип f является Functor, если он предоставляет функцию fmap, которая, учитывая любые типы a и b, позволяет применить любую функцию из (a -> b) для преобразования f a в f b, сохраняя структуру f Фактически, f должен соответствовать следующим условиям:
Обратите внимание, что второе условие следует из свободной теоремы для типа fmap и первого условия, поэтому вам достаточно проверить выполнение первого.
Минимальное полное определение
Методы
fmap :: (a -> b) -> f a -> f b Источник
Используя ApplicativeDo: 'fmap f as' можно рассматривать как выражение do
do a <- as pure (f a)
с выведенным ограничением Functor.
(<$) :: a -> f b -> f a infixl 4 Источник
Заменить все позиции в входных данных одинаковым значением. По умолчанию определяется как fmap . const, но это может быть переопределено более эффективной версией.
Используя ApplicativeDo: 'a <$ bs' можно рассматривать как выражение do
do bs pure a
с выведенным ограничением Functor.
Примеры реализации
| Functor [] | Since: base-2.1 |
| Functor Maybe | Since: base-2.1 |
| Functor IO | Since: base-2.1 |
| Functor Par1 | Since: base-4.9.0.0 |
| Functor NonEmpty | Since: base-4.9.0.0 |
| Functor NoIO | Since: base-4.8.0.0 |
| Functor ReadP | Since: base-2.1 |
| Functor ReadPrec | Since: base-2.1 |
| Functor Down | Since: base-4.11.0.0 |
| Functor Product | Since: base-4.8.0.0 |
| Functor Сумма | С момента: base-4.8.0.0 |
Определено в Data.Semigroup.Internal Методыfmap :: (a -> b) -> Сумма a -> Сумма b Исходный код (<$) :: a -> Сумма b -> Сумма a Исходный код | |
| Functor Dual | С момента: base-4.8.0.0 |
Определено в Data.Semigroup.Internal | |
| Functor Последний | С момента: base-4.8.0.0 |
Определено в Data.Monoid Методыfmap :: (a -> b) -> Последний a -> Последний b Исходный код (<$) :: a -> Последний b -> Последний a Исходный код | |
| Functor Первый | С момента: base-4.8.0.0 |
Определено в Data.Monoid Методыfmap :: (a -> b) -> Первый a -> Первый b Исходный код (<$) :: a -> Первый b -> Первый a Исходный код | |
| Functor STM | С момента: base-4.3.0.0 |
Определено в GHC.Conc.Sync | |
| Functor Обработчик | С момента: base-4.6.0.0 |
Определено в Control.Exception Методыfmap :: (a -> b) -> Обработчик a -> Обработчик b Исходный код (<$) :: a -> Обработчик b -> Обработчик a Исходный код | |
| Functor Тождество | С момента: base-4.8.0.0 |
Определено в Data.Functor.Identity Методыfmap :: (a -> b) -> Тождество a -> Тождество b Исходный код (<$) :: a -> Тождество b -> Тождество a Исходный код | |
| Functor ZipList | С момента: base-2.1 |
Определено в Control.Applicative Методыfmap :: (a -> b) -> ZipList a -> ZipList b Исходный код (<$) :: a -> ZipList b -> ZipList a Исходный код | |
| Functor ArgDescr | С момента: base-4.6.0.0 |
Определено в System.Console.GetOpt Методыfmap :: (a -> b) -> ArgDescr a -> ArgDescr b Исходный код (<$) :: a -> ArgDescr b -> ArgDescr a Исходный код | |
| Functor OptDescr | С момента: base-4.6.0.0 |
| Functor ArgOrder | Since: base-4.6.0.0 |
| Functor Option | Since: base-4.9.0.0 |
| Functor Last | Since: base-4.9.0.0 |
| Functor First | Since: base-4.9.0.0 |
| Functor Max | Since: base-4.9.0.0 |
| Functor Min | Since: base-4.9.0.0 |
| Functor Complex | Since: base-4.9.0.0 |
| Functor (Either a) | Since: base-3.0 |
| Functor (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Определено в GHC.Generics | |
| Functor (U1 :: Тип -> Тип) | С момента: base-4.9.0.0 |
Определено в GHC.Generics | |
| Functor ((,) a) | С момента: base-2.1 |
Определено в GHC.Base Методыfmap :: (a0 -> b) -> (a, a0) -> (a, b) Исходный код (<$) :: a0 -> (a, b) -> (a, a0) Исходный код | |
| Functor (ST s) | С момента: base-2.1 |
Определено в GHC.ST | |
| Functor (Array i) | С момента: base-2.1 |
Определено в GHC.Arr Методыfmap :: (a -> b) -> Array i a -> Array i b Исходный код (<$) :: a -> Array i b -> Array i a Исходный код | |
| Functor (Proxy :: Тип -> Тип) | С момента: base-4.7.0.0 |
Определено в Data.Proxy Методыfmap :: (a -> b) -> Proxy a -> Proxy b Исходный код (<$) :: a -> Proxy b -> Proxy a Исходный код | |
| Arrow a => Functor (ArrowMonad a) | С момента: base-4.6.0.0 |
Определено в Control.Arrow Методыfmap :: (a0 -> b) -> ArrowMonad a a0 -> ArrowMonad a b Исходный код (<$) :: a0 -> ArrowMonad a b -> ArrowMonad a a0 Исходный код | |
| Монад m => Functor (WrappedMonad m) | С момента: base-2.1 |
Определено в Control.Applicative Методыfmap :: (a -> b) -> WrappedMonad m a -> WrappedMonad m b Исходный код (<$) :: a -> WrappedMonad m b -> WrappedMonad m a Исходный код | |
| Functor (ST s) | С момента: base-2.1 |
Определено в Control.Monad.ST.Lazy.Imp | |
| Functor (Arg a) | С момента: base-4.9.0.0 |
| Functor f => Functor (Rec1 f) | Since: base-4.9.0.0 |
| Functor (URec Char :: Type -> Type) | Since: base-4.9.0.0 |
| Functor (URec Double :: Type -> Type) | Since: base-4.9.0.0 |
| Functor (URec Float :: Type -> Type) | Since: base-4.9.0.0 |
| Functor (URec Int :: Type -> Type) | Since: base-4.9.0.0 |
| Functor (URec Word :: Type -> Type) | Since: base-4.9.0.0 |
| Functor (URec (Ptr ()) :: Type -> Type) | Since: base-4.9.0.0 |
| Functor ((,,) a b) | Since: base-4.14.0.0 |
| Functor f => Functor (Alt f) | Since: base-4.8.0.0 |
| Functor f => Functor (Ap f) | Since: base-4.12.0.0 |
| Functor (Const m :: Type -> Type) | Since: base-2.1 |
| Functor m => Functor (Kleisli m a) | Since: base-4.14.0.0 |
| Arrow a => Functor (WrappedArrow a b) | Since: base-2.1 |
Определено в Control.Applicative Методыfmap :: (a0 -> b0) -> WrappedArrow a b a0 -> WrappedArrow a b b0 Source (<$) :: a0 -> WrappedArrow a b b0 -> WrappedArrow a b a0 Source | |
| Functor ((->) r :: Type -> Type) | Since: base-2.1 |
| Functor (K1 i c :: Type -> Type) | Since: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (f :+: g) | Since: base-4.9.0.0 |
| (Functor f, Functor g) => Functor (f :*: g) | Since: base-4.9.0.0 |
Определено в GHC.Generics Методыfmap :: (a -> b) -> (f :*: g) a -> (f :*: g) b Исходный код (<$) :: a -> (f :*: g) b -> (f :*: g) a Исходный код | |
| Functor ((,,,) a b c) | С момента: base-4.14.0.0 |
Определено в GHC.Base Методыfmap :: (a0 -> b0) -> (a, b, c, a0) -> (a, b, c, b0) Исходный код (<$) :: a0 -> (a, b, c, b0) -> (a, b, c, a0) Исходный код | |
| (Functor f, Functor g) => Functor (Sum f g) | С момента: base-4.9.0.0 |
Определено в Data.Functor.Sum Методыfmap :: (a -> b) -> Sum f g a -> Sum f g b Исходный код (<$) :: a -> Sum f g b -> Sum f g a Исходный код | |
| (Functor f, Functor g) => Functor (Product f g) | С момента: base-4.9.0.0 |
Определено в Data.Functor.Product Методыfmap :: (a -> b) -> Product f g a -> Product f g b Исходный код (<$) :: a -> Product f g b -> Product f g a Исходный код | |
| Functor f => Functor (M1 i c f) | С момента: base-4.9.0.0 |
Определено в GHC.Generics Методыfmap :: (a -> b) -> M1 i c f a -> M1 i c f b Исходный код (<$) :: a -> M1 i c f b -> M1 i c f a Исходный код | |
| (Functor f, Functor g) => Functor (f :.: g) | С момента: base-4.9.0.0 |
Определено в GHC.Generics Методыfmap :: (a -> b) -> (f :.: g) a -> (f :.: g) b Исходный код (<$) :: a -> (f :.: g) b -> (f :.: g) a Исходный код | |
| (Functor f, Functor g) => Functor (Compose f g) | С момента: base-4.9.0.0 |
Определено в Data.Functor.Compose Методыfmap :: (a -> b) -> Compose f g a -> Compose f g b Исходный код (<$) :: a -> Compose f g b -> Compose f g a Исходный код | |
($>) :: Functor f => f a -> b -> f b infixl 4 Исходный код
Перевернутая версия <$.
Используя ApplicativeDo: 'as $> b' можно понимать как выражение do
do as pure b
с выведенным Functor ограничением.
Примеры
Заменить содержимое Maybe Int константой String:
>>> Nothing $> "foo" Nothing >>> Just 90210 $> "foo" Just "foo"
Заменить содержимое Either Int Int константой String, что приводит к Either
Int String:
>>> Left 8675309 $> "foo" Left 8675309 >>> Right 8675309 $> "foo" Right "foo"
Заменить каждый элемент списка константой String:
>>> [1,2,3] $> "foo" ["foo","foo","foo"]
Заменить второй элемент пары константой String:
>>> (1,2) $> "foo" (1,"foo")
С момента: base-4.7.0.0
(<$>) :: Functor f => (a -> b) -> f a -> f b infixl 4 Исходный код
Инфиксный синоним для fmap.
Название этого оператора является отсылкой к $. Обратите внимание на сходство их типов:
($) :: (a -> b) -> a -> b (<$>) :: Functor f => (a -> b) -> f a -> f b
В то время как $ является применением функции, <$> является применением функции, поднятым над Functor.
Примеры
Преобразование из Maybe Int в Maybe
String с помощью show:
>>> show <$> Nothing Nothing >>> show <$> Just 3 Just "3"
Преобразование из Either Int Int в Either Int String с помощью show:
>>> show <$> Left 17 Left 17 >>> show <$> Right 17 Right "17"
Удвоить каждый элемент списка:
>>> (*2) <$> [1,2,3] [2,4,6]
Применить even ко второму элементу пары:
>>> even <$> (2,2) (2,True)
(<&>) :: Functor f => f a -> (a -> b) -> f b infixl 1 Source
Перевернутая версия <$>.
(<&>) = flip fmap
Примеры
Применение (+1) к списку, Just и Right.
>>> Just 2 <&> (+1) Just 3
>>> [1,2,3] <&> (+1) [2,3,4]
>>> Right 3 <&> (+1) Right 4
С момента: base-4.11.0.0
void :: Functor f => f a -> f () Source
void value игнорирует результат вычисления, например, возвращаемое значение действия IO.
Используя ApplicativeDo: 'void as' можно рассматривать как выражение do,
do as pure ()
с выведенным Functor ограничением.
Примеры
Замена содержимого Maybe Int на единицу:
>>> void Nothing Nothing >>> void (Just 3) Just ()
Замена содержимого Either Int Int на единицу, в результате чего получается Either Int ():
>>> void (Left 8675309) Left 8675309 >>> void (Right 8675309) Right ()
Замена каждого элемента списка на единицу:
>>> void [1,2,3] [(),(),()]
Замена второго элемента пары на единицу:
>>> void (1,2) (1,())
Игнорирование результата действия IO:
>>> mapM print [1,2] 1 2 [(),()] >>> void $ mapM print [1,2] 1 2
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Data-Functor.html