I know that the dot (.) operator takes two functions which both take an argument respectively.
Its type is (.) :: (b -> c) -> (a -> b) -> a -> c
For example, take 1 . drop 2 $ [1,2,3,4,5]
.
But how can (fmap . const)
work?
The fmap function needs two arguments, and the const function takes two arguments and then return the first argument.
So logically, the fmap should take the output which is the first argument taken by the const function.
The types of two functions:
fmap :: Functor f => (a -> b) -> f a -> f b
const :: a -> b -> a
The fmap in (fmap . const) 2 (Just 4)
should get the output 2
returned by the const function, so it’d not work, but actually it does work.
What happened?