According to this question the 2nd Functor law is implied by the 1st in Haskell:
1st Law: fmap id = id
2nd Law : fmap (g . h) = (fmap g) . (fmap h)
Is the reverse true? Starting from 2nd law, and setting g
equal to id
, can I reason the following and get the 1st law?
fmap (id . h) x = (fmap id) . (fmap h) x
fmap h x = (fmap id) . (fmap h) x
x' = (fmap id) x'
fmap id = id
where x' = fmap h x
Functor Laws If two sequential mapping operations are performed one after the other using two functions, the result should be the same as a single mapping operation with one function that is equivalent to applying the first function to the result of the second.
The expression fmap (*2) is a function that takes a functor f over numbers and returns a functor over numbers. That functor can be a list, a Maybe , an Either String, whatever. The expression fmap (replicate 3) will take a functor over any type and return a functor over a list of elements of that type.
Functor in Haskell is a typeclass that provides two methods – fmap and (<$) – for structure-preserving transformations. To implement a Functor instance for a data type, you need to provide a type-specific implementation of fmap – the function we already covered.
No
data Break a = Yes | No
instance Functor Break where
fmap f _ = No
clearly the second law holds
fmap (f . g) = const No = const No . fmap g = fmap f . fmap g
but, the first law does not. The problem with your argument is not all x'
are of the form fmap f x
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With