[Haskell-cafe] Class constraints on associated types ...

aditya siram aditya.siram at gmail.com
Fri Jan 2 18:59:52 UTC 2015

Hi all,
I'd like to be able to constrain an associated type.

I used to have an instance that looked like:
class Dispatch a b c | a b -> c where
   runF :: a -> b -> c
instance (C a) => Dispatch D1 D2 ( a -> IO ()) where
   runF d1 d2 = (\_ -> return ())

Since I upgraded to 7.8 from 7.5 that instance declaration is no longer
accepted is no longer accepted since it violates FD's.

I have been updating my code to use type families like so:
class Dispatch a b where
   type Impl a b :: *
   runF :: a -> b -> Impl a b
instance (C a) => Dispatch D1 D2 where
   type Impl D1 D2 = a -> IO ()
   runF d1 d2 = (\_ return ())

Unfortunately the `type Impl ...` line in the instance is rejected because
it uses `a` on the RHS.

In this one case I could just package it up into a newtype or something but
I would ideally like to be able to constrain any number of arguments like:
instance (C a, C b ... C z) => Dispatch D1 D2 where
   type Impl D1 D2 = a -> b -> ... -> z -> IO ()

This was something I could do in 7.6 (although I realize this is way
safer). How do I go about getting that constraint back?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20150102/a9a554eb/attachment.html>

More information about the Haskell-Cafe mailing list