我在看下面的函数:'f'在functor的fmap函数中代表什么?
fmap :: (a -> b) -> f a -> f b
,我想明白了“F”,如在(f a
或f b
)。我正在阅读的文章将其描述为一个“盒子”,但它的实际正确名称是什么?它只是一个类型变量?我觉得我很困惑,并认为它是一个功能应用程序 - 这是正确的?
我在看下面的函数:'f'在functor的fmap函数中代表什么?
fmap :: (a -> b) -> f a -> f b
,我想明白了“F”,如在(f a
或f b
)。我正在阅读的文章将其描述为一个“盒子”,但它的实际正确名称是什么?它只是一个类型变量?我觉得我很困惑,并认为它是一个功能应用程序 - 这是正确的?
你的直觉认为它是一种功能应用是正确的,但它们不是常规功能。相反,这是类型级别的类型构造函数的应用。
具体而言,函子必须有一种(类型的型)* -> *
这意味着它们采取一个类型参数,并产生一个具体类型*
诸如,例如,[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
这是一个类型变量,代表你在工作中特别是仿例如IO是一个仿函数,这样你就可以专注fmap
到
fmap :: (a -> b) -> IO a -> IO b
同样,你可以把它具体化到列表:
fmap :: (a -> b) -> [a] -> [b]
另外,你可以在'ghci'中看到'f'是如何使用':t'命令绑定的。用':t fmap(+ 3)[1,2,3]'比较':t fmap'。 – chepner
这不是'fmap'的类型。它是'fmap :: Functor f =>(a - > b) - > f a - > f b' – Sarah
它是一个类型变量,是的,但我认为您的兴趣窥探它的* kind *。请参阅[种类和某些类型 - 富(LYAH)](http://learnyouahaskell.com/making-our-own-types-and-typeclasses#kinds-and-some-type-foo)。 – MasterMastic