[Haskell-cafe] extensible effects + classy lenses

Mitchell Rosen mitchellwrosen at gmail.com
Wed Mar 9 00:02:13 UTC 2016


Sorry, in "foo", the body should be "fmap getInt get". Still, same type 
error.

On Tuesday, March 8, 2016 at 3:59:23 PM UTC-8, Mitchell Rosen wrote:
>
> Hi all,
>
> I'm trying to combine an extensible effects style state with classy 
> lenses. That is, instead of pinning the type of my state down, I'd like to 
> only require the pieces I need.
>
> For example,
>
> {-# language FlexibleContexts #-}
>
> import Control.Monad.Freer
> import Control.Monad.Freer.State
>
> class HasInt s where
>   getInt :: s -> Int
>
> foo :: (Member (State s) effs, HasInt s) => Eff effs Int
> foo = get
>
> However, this fails to typecheck:
>
>     Overlapping instances for Member (State s0) effs
>     Matching givens (or their superclasses):
>       (Member (State s) effs)
>         bound by the type signature for
>                    foo :: (Member (State s) effs, HasInt s) => Eff effs Int
>         at example.hs:9:8-56
>     Matching instances:
>       instance Data.Open.Union.Member'
>                  t r (Data.Open.Union.FindElem t r) =>
>                Member t r
>         -- Defined in ‘Data.Open.Union’
>     (The choice depends on the instantiation of ‘effs, s0’)
>     In the ambiguity check for the type signature for ‘foo’:
>       foo :: forall (effs :: [* -> *]) s.
>              (Member (State s) effs, HasInt s) =>
>              Eff effs Int
>     To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
>     In the type signature for ‘foo’:
>       foo :: (Member (State s) effs, HasInt s) => Eff effs Int
>
> Is this a weakness of extensible effects, or is there another way to 
> express this function?
>
> Thanks,
> Mitchell
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20160308/0188a8b4/attachment.html>


More information about the Haskell-Cafe mailing list