为什么 Functor 限制 map 的定义?

Why Functor restricts the definition of map?

我正在听 Kris Nuttycombe 的 LambdaConf 2015 演讲,题目是 Parametricity The Essence of Information Hiding。在 12:20,演讲者谈到为什么这个函数的定义不是 map,即使它共享相同的类型签名:

asdf :: forall a b. (a -> b) -> [a] -> [b]
  • Every value in the output is obtained by applying the function provided to a member of the input.

  • BUT List gives the implementer too much information, and thecaller too little.

    asdf :: forall a b. (a -> b) -> [a] -> [b]
    asdf f [] = []
    asdf f (x : _) = [f x]
    

当然,类型签名和map一样;然而,结果是一个单例列表,f 应用于头部。

演讲者说我们应该设置 Functor 限制。从那时起,我不明白为什么会这样。有人可以给我任何指示吗?

演讲者赞成类型。他想向观众展示,类型在某些情况下可用于限制可能的实现。当他到达

asdf :: forall a b. (a -> b) -> [a] -> [b]

他解释说,这将允许多个实现,但切换到 Functor 约束会有所帮助。

asdf :: Functor f => (a -> b) -> f a -> f b

他似乎也将他的演讲分成了第一部分,在第一部分他忽略了细节以传达他的主要信息,在第二部分他进入了一些细节。值得一提的是,我在第一部分分享了您对演讲者论点的困惑,我认为这是快速而松散的推理。我觉得你也不应该挖得太深。

最后一点,您可能会喜欢 Edward Kmett 的 The free theorem for fmap which also lists the free theorem for fmap and gives a link to Philip Wadler's Theorems for Free!