Learn you a haskell给出了Functor类型类的描述。
我可以看到,对于列表,它实现如下:
instance Functor [] where
fmap = map
但这是如何运作的?
在类型类Functor中,fmap甚至没有实现。所有它只是这样的类型声明:
class Functor f where
fmap :: (a -> b) -> f a -> f b
只是通过类型声明,Haskell如何正确地找出列表的映射操作?
答案 0 :(得分:16)
map
只是类型为(a -> b) -> [a] -> [b]
的普通函数。与fmap
不同,{em>不是Functor
类型类的一部分。它完全符合您的想法。
类型类背后的想法是你使用类型来确定要使用的实现。当我们说instance Functor [] where ...
时,我们告诉编译器fmap
(列表类型)[]
的实现是什么。
在这种情况下,fmap
的实现只是map
,这是一个正常的功能。