Skip to content

Added Members Constraint

Will Fancher requested to merge ElvishJerricco/freer:master into master

The Members type family (closed) takes two type-level lists, m and r, as parameters. m contains the effect labels which should be members of r. The resulting type is a constraint requiring that all elements of m be members of r.

This simplifies constraints that require multiple members of the same effect list. For example.

ioState :: (Member IO r, Member (State Int) r) => Eff r ()

becomes

ioState :: Members '[IO, State Int] r => Eff r ()

Furthermore, it allows apps to easily define their typical effect constraints alongside the typical runtime effect.

type AppEffs = '[State Int, Writer String, IO]

type AppConstraint r = Members AppEffs r

type RunApp = Eff AppEffs

Merge request reports