'f'在仿函数的fmap函数中表示什么?

jcm*_*jcm 3 haskell functor

我正在看以下功能:

fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

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

Sar*_*rah 8

你直觉它是一种功能应用是正确的,但它们不是常规功能.相反,这是类型构造函数在类型级别上的应用.

具体来说,Functors必须具有类型(类型类型)* -> *,这意味着它们采用一种类型参数并生成具体类型*,例如[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
Run Code Online (Sandbox Code Playgroud)


ama*_*loy 7

它是一个类型变量,代表您正在使用的特定仿函数.例如,IO是一个仿函数,因此您可以专注fmap

fmap :: (a -> b) -> IO a -> IO b
Run Code Online (Sandbox Code Playgroud)

同样,您可以将其专门化为列表:

fmap :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)