>> The situation is as if we [had] a FD: > Well, that is indeed equivalent here in the second argument of class > F, but I constructed the example to show an issue in the class's > *first* argument.
The example should be equivalent in all respects (at least that was my motivation when I wrote it). > Notice you needed to add type-signatures, on the functions you named > "g" -- in particular their first arguments -- to make the example > work with only FDs? I wrote g, with type signatures, just to avoid writing the type signatures (f:: Bool->Bool and f::Int->Bool) inside (f o). I wanted to use, textually, the same expression. > These are two different expressions that are being printed, because > " :: Bool -> Bool" is different from " :: Int -> Bool". In my > example of using your proposal, one cannot inline in the same way, I wrote the example just to show that one can obtain the same effect with FDs: one not "inline", i.e. use "g o", in the same way. > If your proposal was able to require those -- and only those -- bits > of type signatures that were essential to resolve the above > ambiguity; for example, the ( :: Int) below, > module Q where > import C > instance F Int Bool where f = even > instance O Int where o = 0 > k = f (o :: Int) >, then I would be fine with your proposal (but then I suspect it > would have to be equivalent to FDs -- or in other words, that it's not > really practical to change your proposal to have that effect). > I stand by my assertion that "the same expression means different > things in two different modules" is undesirable, (and that I suspect > but am unsure that this undesirability is named "incoherent > instances"). "k::Bool; k=f o" in Q has exactly the same effect as "k=f(o::Int)", under our proposal. "(f o)::Bool" in P and in Q are not "the same expression", they are distinct expressions, because they occur in distinct contexts which make "f" and "o" in (f o)::Bool denote distinct values, just as "(g o)::Bool" are distinct expressions in P and Q in the example with a FD (because "g" and "o" in (g o)::Bool denote distinct values in P and in Q). Cheers, Carlos
_______________________________________________ Haskell-prime mailing list Haskell-prime@haskell.org http://www.haskell.org/mailman/listinfo/haskell-prime