2015-04-23 81 views
3

我在看下面的函数:'f'在functor的fmap函数中代表什么?

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

,我想明白了“F”,如在(f af b)。我正在阅读的文章将其描述为一个“盒子”,但它的实际正确名称是什么?它只是一个类型变量?我觉得我很困惑,并认为它是一个功能应用程序 - 这是正确的?

+3

这不是'fmap'的类型。它是'fmap :: Functor f =>(a - > b) - > f a - > f b' – Sarah

+2

它是一个类型变量,是的,但我认为您的兴趣窥探它的* kind *。请参阅[种类和某些类型 - 富(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

另外,你可以在'ghci'中看到'f'是如何使用':t'命令绑定的。用':t fmap(+ 3)[1,2,3]'比较':t fmap'。 – chepner

相关问题