Notes (HPFP 16/31): Functor
16 Functor
16.4 Let’s talk about 4, baby
Excercises: Be Kind
*
b
is `* ->,
Tis
-> *`- `* -> * -> *`
16.7 Commonly used functors
Exercises: Heavy Lifting
16.10 Exercises: Instances of Func
- Trivial doesn’t have anything inside it that fmap can apply a function to, fmap doesn’t make sense for things with kind
*
, or rather fmap on type constants is just function application, which is all f and no map.
- Trivial doesn’t have anything inside it that fmap can apply a function to, fmap doesn’t make sense for things with kind
16.11 Ignoring possibilities
Exercise: Possibly
Short Exercise
- The
a
inFirst a
might be a different type than theb
inSecond b
. The function we pass to fmap can only operate on one of those types, but not both. In other words the function that fmap maps is of typeb -> c
and kind*
. Furthermore, we have to apply the function toSecond b
rather thanFirst a
, because the structure that fmaps maps onto is of kind ` ->. Our structure is
(Sum a)because
Sumis of kind
* -> * -> *and it needs to have accepted every type constructor but the last before its something that fmap can work on. But that doesn't mean we're barred from writing another function that does something different to
Sum`, but something different wont be fmap.
16.7 Chapter Exercises
Determine if a valid Functor can be written for the datatype provided:
- No, Bool has kind
*
but fmap only works on `* -> *` - Yes, note that
False'
andTrue'
both take the same typea
- Yes, fmap can ignore
Falsish
- Yes… but why…
- Nope, theres nothing to fmap over, kind
*
Rearrange the arguments:
16.19 Follow-up resources
- Haskell Wikibook; The Functor class.
- Mark P. Jones; A system of constructor classes: overloading and implicit higher-order polymorphism.
- Gabriel Gonzalez; The functor design pattern.