【问题标题】:What does the 'f' represent in the fmap function of a functor?函子的 fmap 函数中的“f”代表什么?
【发布时间】:2015-04-23 04:59:09
【问题描述】:

我在看下面的函数:

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

我想了解“f”是什么,例如(f a 或f b)。我正在阅读的文章将其描述为“盒子”,但它的实际正确名称是什么?它只是一个类型变量吗?我想我把它弄糊涂了,认为它是一个函数应用程序——这是正确的吗?

【问题讨论】:

  • 那不是fmap的类型。是fmap :: Functor f => (a -> b) -> f a -> f b
  • 它是一个类型变量,是的,但我认为你的兴趣在于它是 kind。见Kinds and some type-foo (LYAH)。

标签: haskell functor


【解决方案1】:

您认为它是一种函数应用程序的直觉是正确的,但它们不是常规函数。相反,这是在类型级别上应用类型构造函数。

具体来说,Functor 必须有 kind (type-of-type) * -> *,这意味着它们接受一个类型参数并产生一个具体类型 *,例如 [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

【讨论】:

    【解决方案2】:

    它是一个类型变量,代表您正在使用的特定函子。例如 IO 是一个函子,因此您可以将fmap 专门化为

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

    同样,您可以将其专门用于列表:

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

    【讨论】:

    • 另外,您可以在ghci 中使用:t 命令查看f 的绑定方式。比较 :t fmap 和 :t fmap (+ 3) [1,2,3]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2019-08-29
    • 2020-03-19
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多