'f' 在函子的 fmap 函数中代表什么?
What does the 'f' represent in the fmap function of a functor?
我正在查看以下函数:
fmap :: (a -> b) -> f a -> f b
我想了解 'f' 是什么,如(f a
或 f b
)。我正在阅读的文章将其描述为 'box' 但它的实际正确名称是什么?它只是一个类型变量吗?我想我混淆了它并认为它是一个函数应用程序 - 这是正确的吗?
它是一个类型变量,代表您正在使用的特定仿函数。例如 IO 是一个仿函数,因此您可以将 fmap
专门化为
fmap :: (a -> b) -> IO a -> IO b
同样,您可以将其专门化为列表:
fmap :: (a -> b) -> [a] -> [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
我正在查看以下函数:
fmap :: (a -> b) -> f a -> f b
我想了解 'f' 是什么,如(f a
或 f b
)。我正在阅读的文章将其描述为 'box' 但它的实际正确名称是什么?它只是一个类型变量吗?我想我混淆了它并认为它是一个函数应用程序 - 这是正确的吗?
它是一个类型变量,代表您正在使用的特定仿函数。例如 IO 是一个仿函数,因此您可以将 fmap
专门化为
fmap :: (a -> b) -> IO a -> IO b
同样,您可以将其专门化为列表:
fmap :: (a -> b) -> [a] -> [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