ekmett / free

free monads
http://hackage.haskell.org/package/free
Other
161 stars 65 forks source link

Free Apply, Alt, Plus, and Bind #191

Open mstksg opened 5 years ago

mstksg commented 5 years ago

Just added a couple of data types that I've found useful as free structures, that might benefit from being defined in a unified place.

  1. The free Apply is constructed based on how NonEmpty is constructed in base: it just convolves a single f x in front of an Ap. It's basically a "non-empty Ap"
  2. The free Plus (which I call ListF in this PR) arises from the free monoid of functors combined with :*:/Product, like how Free Monad is the free monoid against :.:/Compose and Free Applicative is the free monoid against Day.
  3. The free Alt arises from the free semigroup of functors combined with :*:, like how Apply is the free semigroup w.r.t. Day.
  4. (edit: added later) The free Bind is inspired by iteratees: it can either be "done" with a final computation, or "more" with more computations to consume.

I tried to style the API after the exports in Control.Alternative.Free as reference.

Thanks for the great package :)