Skip to content

Commit

Permalink
improved definition of pointed functor
Browse files Browse the repository at this point in the history
  • Loading branch information
jethrolarson committed Aug 2, 2022
1 parent 69d1b25 commit 6c4dd7d
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 important requirement for satisfying the [Monad](#monad) interface where it is an example of a [Kleisli Arrow](#kleisi-composition).


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.
Expand Down

0 comments on commit 6c4dd7d

Please sign in to comment.