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