第一个Functor Law是否遵循第二个?

时间:2012-11-24 07:40:56

标签: haskell functor

根据this question,哈斯克尔的第一条隐含了第二条探险者的法律:

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

反过来了吗?从第2条法开始,并将g设为id,我可以推理以下内容并获得第1条法律吗?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'返回的fmap第一名,不是任意值。