//@NO-IMPLICIT-PRELUDE //! Implementation of the `Functor` type /// A `Functor` represents an action on a parameterized type which does not /// change the structure with the mapped type. /// /// The following laws should hold: /// /// * `map id == id` /// * `map (f << g) == map f << map g` #[implicit] type Functor f = { /// Apply the supplied function to the contents of `f a`, converting it to /// an `f b` /// /// # Examples /// /// * `option.functor.map show_Int.show (Some 1) == Some "1"` /// * `result.functor.map show_Int.show (Some 1) == Ok "1"` /// * `list.functor.map show_Int.show (list.of [1, 2]) == list.of ["1", "2"]` /// /// # Note /// /// * Known as `fmap` in Haskell map : forall a b . (a -> b) -> f a -> f b } let map ?functor : [Functor f] -> (a -> b) -> f a -> f b = functor.map { Functor, map }