2012-11-24 12 views
6

Secondo this question la legge secondo Functor è implicito nel 1 ° in Haskell:Haskell Prima Legge Functor da Second

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

è il vero contrario? A partire dalla 2a legge e impostando g uguale a id, posso motivare quanto segue e ottenere la prima legge?

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

dove x' = fmap h x

risposta

11

No

data Break a = Yes | No 

instance Functor Break where 
    fmap f _ = No 

chiaramente la seconda legge stive

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

ma, la prima legge non lo fa. Il problema con il tuo argomento non è tutto x' del modulo fmap f x

7

No, funziona solo in una direzione.

considerare questo Functor esempio:

data Foo a = Foo Int a 

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

Soddisfa la seconda legge, ma non il primo.

L'ultimo passo nella vostra prova non è valido - avete dimostrato che fmap id x' = x', ma questo è limitato a x' s che vengono restituiti dal fmap, in primo luogo, non valori arbitrari.

Problemi correlati