Home > other >  Fmapping over functors
Fmapping over functors

Time:01-31

Say I have the following code:

data LiftItOut f a = LiftItOut (f a)
    deriving Show

instance (Functor fct) => Functor (LiftItOut fct) where
    fmap f (LiftItOut fctor) = LiftItOut (fmap f fctor)

If I try calling fmap (\x-> 3 x) (LiftItOut ( 3)) it doesn't work. Though, wouldn't it make sense to work? The result would be LiftItOut (fmap (\x ->3 x) ( 3)) and, as I see it, the 3 would be fed to ( 3) and the result would be wrapped in LiftItOut. I read about (->r) functors on learnyouahaskell though it didn't click with me. Appreciate any and every bit of help

CodePudding user response:

You're right in that you'd get to LiftItOut (fmap (\x -> 3 x) ( 3)), and you correctly identified that the wrapped functor of interest is the function functor (N.B. the (r ->) functor, not the (-> r) functor), but your reasoning from there got a bit sloppy. Recall that for functions, we have fmap = (.). So:

LiftItOut (fmap (\x -> 3 x) ( 3))
= { fmap = (.) }
LiftItOut ((\x -> 3 x) . ( 3))
= { f . g = \y -> f (g y) }
LiftItOut (\y -> (\x -> 3 x) (( 3) y))
= { section application }
LiftItOut (\y -> (\x -> 3 x) (y   3))
= { lambda application }
LiftItOut (\y -> 3 (y   3))

...not exactly the result you were thinking you'd get, I wager! And hopefully in this simplified form it's more clear why this isn't really sensible: y 3 is probably sensible enough, but you are attempting to provide that as an argument to 3, which isn't really a function.

  • Related