Functor is a mapping from type F[A] hight kind to F[B]. Scalaz defines Functor[F[_]] trait with map abstract method.

Having a higher kind A and A to B mapping we can get higher kind B.

Having map function we can define lift fucntion that takes A ⇒ B mapping and it lifts it to F[A] ⇒ F[B] mapping.

Since map is curried and first parameter list is F[A] and we pass f as second parameter list, we get back F[A] ⇒ F[B] function. Other operations scalaz derives from map function are:

• , apply, map. Those are all aliases for map function. `List(1, 2, 3) ∘ (_ + 1) = List(2, 3, 4)`
• strengthL. Injects value to the left. `List(1,2,3).strengthL("a") = List((a,1), (a,2), (a,3))`
• strengthR. Injects value to the right. `List(1,2,3).strengthR("a") = List((1,a), (2,a), (3,a))`
• fpair. Pairs all values into tupples of two. `List(1, 2, 3).fpair = List((1,1), (2,2), (3,3))`
• fproduct. Pairs all values into tupples of two where first element is a and second element is f(a). `List(1, 2, 3).fproduct(_ + 1) = List((1,2), (2,3), (3,4))`
• void. Maps elements to void values. `List(1, 2, 3).void = List((), (), ())`
• fpoint. Points values into an applicative. `List(1, 2, 3).fpoint(scalaz.std.option.optionInstance) = List(Some(1), Some(2), Some(3))`
• >| and as. Changes all values to provided value. `List(1, 2, 3) >| "a" = List(a, a, a)`

## Output

``````List(1,2,3) ∘ (_ + 1)                                      List(2, 3, 4)
List(1,2,3).strengthL("a")                                 List((a,1), (a,2), (a,3))
List(1,2,3).strengthR("a")                                 List((1,a), (2,a), (3,a))
List(1, 2, 3).fpair                                        List((1,1), (2,2), (3,3))
List(1, 2, 3).fproduct(_ + 1)                              List((1,2), (2,3), (3,4))
List(1, 2, 3).void                                         List((), (), ())
List(1, 2, 3).fpoint(scalaz.std.option.optionInstance)     List(Some(1), Some(2), Some(3))
List(1, 2, 3) >| "a"                                       List(a, a, a)
``````