类型分类百科全书 http://www.haskell.org/haskellwiki/Typeclassopedia says:
“类似的论点还表明,任何满足第一定律(fmap id = id)的 Functor 实例也将自动满足第二定律。实际上,这意味着只需要检查第一定律(通常通过非常简单的归纳法)以确保 Functor 实例有效。”
如果是这样的话,为什么我们还要提到第二函子定律呢?
Law 1: fmap id = id
Law 2: fmap (g . h) = (fmap g) . (fmap h)
虽然我无法给出证据,但我相信这说明的是由于参数化 http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf,只要第一定律成立,类型系统就强制执行第二定律。指定这两个规则的原因是,在更一般的数学设置中,您可能有一些类别C完全可以从其中定义“映射”C对自身(即一对内功能Obj(C) and Hom(C)分别)遵守第一条规则但不遵守第二条规则,因此无法构成函子。
请记住Functor
Haskell 中的 s 是该类别的内函子Hask,甚至不是所有在数学上被视为内函子的东西Hask可以用 Haskell 表达...参数多态性的约束排除了能够指定一个对于它映射的所有对象(类型)行为不统一的函子。
基于这个线程 http://www.haskell.org/pipermail/haskell-cafe/2010-January/thread.html#71631,普遍的共识似乎是 Haskell 的第二定律遵循第一定律Functor
实例。爱德华·克梅特says http://www.haskell.org/pipermail/haskell-cafe/2010-January/071672.html,
Given fmap id = id
, fmap (f . g) = fmap f . fmap g
遵循自由
fmap 的定理。
这是很久以前在一篇论文中作为旁白发表的,但我忘了在哪里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)