8

根据这个问题,Haskell 中的第 1 条暗示了第 2 函子定律:

1st Law: fmap id = id
2nd Law : fmap (g . h) = (fmap g) . (fmap h)

反过来是真的吗?从第二定律开始,设置g等于id,我可以推理以下并得到第一定律吗?

fmap (id . h) x = (fmap id) . (fmap h) x
fmap h x = (fmap id) . (fmap h) x
x' = (fmap id) x'
fmap id = id

在哪里x' = fmap h x

4

2 回答 2

12

data Break a = Yes | No

instance Functor Break where
   fmap f _ = No

显然第二定律成立

   fmap (f . g) = const No = const No . fmap g = fmap f . fmap g

但是,第一定律没有。您的论点的问题并非都是x'形式fmap f x

于 2012-11-24T07:59:29.700 回答
8

不,它只在一个方向上起作用。

考虑这个Functor例子:

data Foo a = Foo Int a

instance Functor Foo where
    fmap f (Foo _ x) = Foo 5 (f x)

它满足第二定律,但不满足第一定律。

证明中的最后一步是无效的——你证明了fmap id x'= x',但这仅限于首先x'返回的 s ,而fmap不是任意值。

于 2012-11-24T07:59:36.540 回答