在Data.Functor的文件中,以下两个是作为所有仿函数应遵守的仿函数法则。
fmap id == id
fmap (f . g) == fmap f . fmap g
我的直觉告诉我仿函数应该工作的方式是它们应该是“结构保留”,换句话说,如果你有一个函数f :: a -> b
并且它是反向的{{1那么
g :: b -> a
我无法提出fmap f . fmap g == id
的实施,这将遵守前两个法律并违反第二个法律,但这几乎无法证明。有人可以开导我吗?
答案 0 :(得分:13)
实际上,你的第三个"仿函数法直接遵循实际的仿函数法和f . g ≡ id
:
fmap f . fmap g ≡ fmap (f . g) ≡ fmap id ≡ id
还有更多:Haskell确保如果第一定律适用于Functor
实例,那么第二定律也适用(这是fmap
类型的自由定理)。即您必须仅为fmap id ≡ id
实例证明Functor
法律,以确保其有效。