Formalmente, un funtor es un tipo F[A] con un map de tipo (A => B) => F[B].
Cats codifica Functor como una clase de tipos, cats.Functor, por lo que el método se ve un poco diferente. Acepta la F[A] inicial como parámetro junto con la función de transformación. Aquí hay una versión simplificada de la definición:
package cats
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
Los funtores garantizan la misma semántica ya sea que secuenciamos muchas operaciones pequeñas una por una o las combinemos en una función más grande antes de llamar a map. Para garantizar que esto sea así, deben cumplirse las siguientes leyes: Identidad: llamar a map con la función de identidad es lo mismo que no hacer nada:
fa.map(a => a) == fa
Composición: llamar a map con dos funciones f y g es lo mismo que llamar a map con f y luego con g:
fa.map(g(f(_))) == fa.map(f).map(g)