为什么 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!。
我正在听 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!。