I have this data type:
data Arf a = Ser a [Arf a] deriving Show
When instantiating Functor
this code works:
instance Functor Arf where
fmap f [] = []
fmap f (Ser x xs) = Ser (f x) (map (fmap f) x)
Why is (map (fmap f) x)
used instead of (fmap f x)
in the second argument to Ser
?
CodePudding user response:
I think there's a typo in your code: at the very end of the last line, it should be xs
instead of x
.
With that out of the way, let's discuss the maps.
The inner fmap
maps the function f
over the Arf a
type. So you might observe that in this case:
fmap f :: Arf a -> Arf b
But those Arf a
values are in a list! So how do you apply a function that transforms a single Arf a
value to a whole list of those values? With map
of course!
So the outer map
applies to the whole list:
map (fmap f) :: [Arf a] -> [Arf b]
CodePudding user response:
(Fixing as per Fyodor's comment...)
Why is
(map (fmap f) xs)
used instead of(fmap f xs)
in the second argument toSer
?
What is the second argument to Ser
? It's a [Arf a]
, i.e. a list of Arf
s.
How do you apply f
to the elements in the xs
list? You do map ??? xs
...
But what is the ???
function?
Well, you want it to apply f
to the inside those Arf
s, so you need it to call recursively the same fmap
function that you are defining, hence ??? === fmap f
.
Therefore map (fmap f) xs
.