diff --git a/readme.md b/readme.md index 1825604..11b66b1 100644 --- a/readme.md +++ b/readme.md @@ -495,14 +495,21 @@ some(1).map(f).map(g) // = some(3) ``` ## Pointed Functor -An object with an `of` function that puts _any_ single value into it. +An object that is a [Functor](#functor) that can be created from _any_ value. A pointed functor can be seen as a container that can wrap something of any type by [lifting](#lift) that value into it. -ES2015 adds `Array.of` making arrays a pointed functor. +Since JS arrays are functors (have a `.map` method) and have an `Array.of()` function they are pointed functors! ```js Array.of(1) // [1] + +Array.of(1).map(add(1)) // [2] ``` +This `of` function is an example of a [Kleisli Arrow](#kleisi-composition) and an important requirement for satisfying the [Monad](#monad) interface. + + +One could say that JS Promise is a pointed functor since the `.then` method _can_ act like a `.map` and `Promise.resolve` acts like `of`. However, `.then` breaks the functor rules as `Promise.of(1).map(Promise.of)` would equal `Promise.of(Promise.of(1))` but `Promise.resolve(1).then(Promise.resolve)` returns `Promise.resolve(1)`. This makes `.then` act like [.chain](#monad) some of the time and like [.map](#functor) other times. This break the rules of both Functor and Monad! + ## Lift Lifting is when you take a value and put it into an object like a [functor](#pointed-functor). If you lift a function into an [Applicative Functor](#applicative-functor) then you can make it work on values that are also in that functor.