[Haskell-cafe] No instance - but it could just put one in the context
Tom Ellis
tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk
Thu Feb 22 23:16:35 UTC 2018
That's amazing! How many times have I been tripped up by that ... Thanks a
lot, Adam.
On Thu, Feb 22, 2018 at 11:11:18PM +0000, Adam Bergmark wrote:
> This works if you enable NoMonomorphismRestriction.
>
> On Thu, 22 Feb 2018 at 23:41 Tom Ellis <
> tom-lists-haskell-cafe-2013 at jaguarpaw.co.uk> wrote:
>
> > I'm puzzled by GHC's behaviour in the following program.
> >
> > 'baz = bar . foo' does not work because there is "no instance for ...".
> > But
> > if I manually assume those instances in the context all is fine. Why can
> > GHC not infer that context? Is there any extension or clever trick I can
> > use to get this to infer like I want?
> >
> > Thanks,
> >
> > Tom
> >
> >
> >
> > {-# LANGUAGE MultiParamTypeClasses #-}
> > {-# LANGUAGE TypeFamilies #-}
> > {-# LANGUAGE FlexibleContexts #-}
> >
> > class Foo a b
> > class Bar a b
> > type family Quux a
> >
> > foo :: ( Foo a b
> > , b ~ Quux a )
> > => a
> > -> Quux a
> > foo = undefined
> >
> > bar :: Bar a b
> > => a
> > -> b
> > bar = undefined
> >
> > -- Doesn't work
> > -- No instance for (Bar (Quux a0) c0) arising from a use of ‘bar’
> > -- No instance for (Foo a0 (Quux a0)) arising from a use of ‘foo’
> > --baz = bar . foo
> >
> > baz' :: ( Foo a (Quux a)
> > , Bar (Quux a) b )
> > => a
> > -> b
> > baz' = bar . foo
More information about the Haskell-Cafe
mailing list