根据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
答案 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
第一名,不是任意值。