2012-11-24 10 views
6

Nach this question der zweiten Functor Gesetz wird von der ersten in Haskell implizierte:Haskell Erste Functor Gesetz von Second

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

das Gegenteil der Fall ist? Ausgehend vom 2. Gesetz, und Einstellung g gleich id, kann ich die folgenden und das erste Gesetz zu begründen?

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

wo x' = fmap h x

Antwort

11

Kein

data Break a = Yes | No 

instance Functor Break where 
    fmap f _ = No 

eindeutig das zweite Gesetz

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

aber, das erste Gesetz hält nicht. Das Problem mit Ihrem Argument ist nicht alle x' sind von der Form fmap f x

7

Nein, es funktioniert nur in einer Richtung.

Betrachten Sie diese Functor Beispiel:

data Foo a = Foo Int a 

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

Es das zweite Gesetz erfüllt aber nicht die erste.

Der letzte Schritt in dem Beweis ist ungültig - Sie haben gezeigt, dass fmap id x' = x', aber diese auf x' s beschränkt sind, die von fmap an erster Stelle zurückgegeben werden, nicht beliebige Werte.