算子法律是否证明结构的完整保存?

kqr*_*kqr 8 haskell functional-programming category-theory

在Data.Functor的文档中,以下两个被称为仿函数法则,所有仿函数都应该遵守.

fmap id  ==  id
fmap (f . g)  ==  fmap f . fmap g
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我仿函数应该工作的方式是它们应该是"结构保留",或者换句话说,如果你有一个函数f :: a -> b而它是逆的g :: b -> a那么

fmap f . fmap g  ==  id
Run Code Online (Sandbox Code Playgroud)

我没有能够提出一个fmap坚持前两个法律并违反第二个法律的实施,但这几乎不能证明.有人可以开导我吗?

fiz*_*ruk 13

实际上,您的"第三"仿函数法直接遵循实际的仿函数法律以及以下事实f . g ? id:

fmap f . fmap g ? fmap (f . g) ? fmap id ? id
Run Code Online (Sandbox Code Playgroud)

还有更多:Haskell确保如果第一个法则成立Functor,那么第二个法则也成立(这是一个类型的自由定理fmap).即你必须fmap id ? id为你的Functor实例证明法律,以确保它是有效的.

  • @Sibi注意`f.g≡id`并不意味着`g.f≡id`.但是,如果是这种情况,则两个函数都称为_"同构"_.否则,`f`被称为_"缩回"_(或_"左边的"g`"_"和"g"被称为_"section"_(或_"与"f`"_的右逆). (7认同)