算子法律是否证明结构完全保留?

时间:2014-05-15 10:19:27

标签: haskell functional-programming category-theory

Data.Functor的文件中,以下两个是作为所有仿函数应遵守的仿函数法则。

fmap id  ==  id
fmap (f . g)  ==  fmap f . fmap g

我的直觉告诉我仿函数应该工作的方式是它们应该是“结构保留”,换句话说,如果你有一个函数f :: a -> b并且它是反向的{{1那么

g :: b -> a

我无法提出fmap f . fmap g == id 的实施,这将遵守前两个法律并违反第二个法律,但这几乎无法证明。有人可以开导我吗?

1 个答案:

答案 0 :(得分:13)

实际上,你的第三个"仿函数法直接遵循实际的仿函数法和f . g ≡ id

这一事实
fmap f . fmap g ≡ fmap (f . g) ≡ fmap id ≡ id

还有更多:Haskell确保如果第一定律适用于Functor实例,那么第二定律也适用(这是fmap类型的自由定理)。即您必须仅为fmap id ≡ id实例证明Functor法律,以确保其有效。