在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坚持前两个法律并违反第二个法律的实施,但这几乎不能证明.有人可以开导我吗?