2008/12/21 Iavor Diatchki <iavor.diatchki@gmail.com>


g :: TestClass a => a -> Integer
g = fst (a :: (a -> Integer, a -> Integer))

Which I believe needs to be written:

g :: forall a. TestClass a => a -> Integer
g = fst (a :: (a -> Integer, a -> Integer))
 


Here we are using another GHC extension called "scoped type variables"
to associate the "a" in the type signature of "g" with the "a" in the
type annotation for the value "a".

Hope that this helps,
Iavor




On Sun, Dec 21, 2008 at 9:21 AM, Maurí­cio <briqueabraque@yahoo.com> wrote:
>>> Why isn't the last line of this code allowed?
>>> f :: (TestClass a) => a -> Integer
>>> f = const 1
>>> a = (f,f)
>>> g = fst a
>>> The only thing I can think about is monomorphism
>>> restriction, but it's allowed (...)
>
>> (...) The reason is that a has type
>> a :: (TestClass a, TestClass b) => (a,b)
>> and then when we take 'fst' of this value (as in g) we get
>
>> g :: (TestClass a, TestClass b) => a
>> which is an ambiguous type, (...)
>
> Is there some version (i.e., set of extensions) of
> Haskell where this would be allowed?
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe