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.
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"
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.
The free Alt arises from the free semigroup of functors combined with :*:, like how Apply is the free semigroup w.r.t. Day.
(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.
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.
Apply
is constructed based on howNonEmpty
is constructed in base: it just convolves a singlef x
in front of anAp
. It's basically a "non-emptyAp
"Plus
(which I callListF
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 againstDay
.Alt
arises from the free semigroup of functors combined with:*:
, like howApply
is the free semigroup w.r.t.Day
.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 :)