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实例证明法律,以确保它是有效的.