[Haskell-cafe] Re: aggressiveness of functional dependencies

apfelmus at quantentunnel.de apfelmus at quantentunnel.de
Thu Nov 9 08:44:41 EST 2006


Nicolas Frisby wrote:

>> > The inferred type for rite_t1 is
>> > rite_t1 :: (Iso (Either Char a) (Either f' g')) => () -> Either f' g'
>> >
>> > Why isn't the inferred type of rite_t1 the same as the ascribed type
>> > of rite_t1'?
>> >
>> > > rite_t1' :: Iso b b' => () -> Either MyChar b'
>> > > rite_t1' () = rite t1

I think GHC does not know whether the given instance declaration

   instance ... => Iso (Either a b) (Either a' b')

even applies to the special case of (a = Char) because it mostly ignores
the preconditions on the left side of (=>). Hugs is much different.
Maybe  throwing away undecidable instances will drastically change things.

> Last post until a response I promise! Another demonstration:
>
> bar () = runIdentity . flip runStateT 0 $ return 'c'
>
> Inferred signature:
>   bar :: (Monad (StateT s Identity), Num s) => () -> (Char, s)
>
> Why not?
>   bar :: Num s => () -> (Char, s)
>
> I am not coming up with an s that could prevent (StateT s Identity)
> from being a monad. Is there one?

The same might go on for this case. By not looking at the preconditions
in the instance declaration

    instance Monad m => Monad (StateT s m)

GHC concludes that (Monad (StateT s Identity)) might or might not hold
depending on s.

Regards,
apfelmus



More information about the Haskell-Cafe mailing list