2015-04-23 2 views
3

Я смотрю на следующей функции:Что означает 'f' в функции fmap функтора?

fmap :: (a -> b) -> f a -> f b 

, и я хочу, чтобы понять, что «е», как и в (f a или f b). Статья, которую я читаю, описывает ее как «поле», но каково ее правильное имя? Это просто переменная типа? Я думаю, что я сбиваю с толку и думаю, что это приложение функции - что правильно?

+3

Это не тип 'fmap'. Это 'fmap :: Functor f => (a -> b) -> f a -> f b' – Sarah

+2

Это переменная типа, да, но то, что я думаю, заглядывает в ваш интерес - это * kind *. См. [Виды и некоторые типы-foo (LYAH)] (http://learnyouahaskell.com/making-our-own-types-and-typeclasses#kinds-and-some-type-foo). – MasterMastic

ответ

8

Ваша интуиция в том, что это своего рода приложение-функция, правильно, но они не являются регулярными функциями. Вместо этого это применение конструкторов типов на уровне типа.

В частности, ФУНКТОРЫ должен иметь вид (тип-типа) * -> *, который означает, что они принимают один аргумент типа и производить конкретный тип *, такие как, например, [Int].

Примеры конструкторов такого типа включают в себя IO, Maybe, [], Either e и многие другие, и эти конкретные примеры имеют действительные экземпляры Functor.

fmap (+1) [1,2,3] :: [] Int -- also known as [Int] 
    = [2,3,4] 
fmap (+1) (Just 1) :: Maybe Int 
    = Just 2 
fmap (+1) (Right 1) :: Either e Int 
    = Right 2 
fmap (+1) (return 1) :: IO Int -- Uses Monad IO instance as well 
    "=" 2 
7

Это переменная типа, представляющая конкретный функтор вы работаете в Например IO функтор, так что вы можете специализироваться fmap для

fmap :: (a -> b) -> IO a -> IO b 

Точно так же вы могли бы специализироваться его списков:.

fmap :: (a -> b) -> [a] -> [b] 
+0

Также вы можете увидеть, как 'f' связан с помощью команды': t' в 'ghci'. Сравните ': t fmap' с': t fmap (+ 3) [1,2,3] '. – chepner

Смежные вопросы