[Haskell-cafe] ANNOUNCE: pqueue-mtl, stateful-mtl
Ryan Ingram
ryani.spam at gmail.com
Mon Feb 16 14:52:27 EST 2009
Don't use the
> data (context) => type = constructors
syntax, it doesn't do what you want.
All it does is add the context to the constructor B while not
providing it to any of the functions that use it.
A better solution is
> data Bar a = forall b. Foo a b => B a b
or, equivalently, using GADT syntax:
> data Bar a where
> B :: Foo a b => a -> b -> Bar a
Pattern matching on B will bring the Foo a b context into scope which
will fix b via the functional dependency.
However, I prefer this way of solving the problem:
> class Foo a where
> type FooVal a
> ...
>
> data Bar a = B a (FooVal a)
-- ryan
2009/2/16 Louis Wasserman <wasserman.louis at gmail.com>:
> Is there a way of exploiting functional dependencies in the following
> fashion?
>
> class Foo a b | a -> b where...
>
> data Foo a b => Bar a = B a b
>
> This is not ambiguous, because the functional dependency ensures a unique b
> if one exists. Can this be done without mentioning b as a type variable in
> Bar?
>
> Louis Wasserman
> wasserman.louis at gmail.com
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
More information about the Haskell-Cafe
mailing list