8

この質問によると、2番目のファンクターの法則は、Haskellの1番目によって暗示されます。

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

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)

これは第 2 法則を満たしますが、第 1 法則は満たしません。

あなたの証明の最後のステップは無効です - あなたはfmap id x'=を示しましたが、これは任意の値ではなく、最初から返された s にx'制限されています。x'fmap

于 2012-11-24T07:59:36.540 に答える