Sittampalam, Ganesh wrote:
Why not instead transform single-range FDs into multi-range ones where
possible?
That's a perfectly reasonable assumption and would establish the logical
property that
a -> b /\ a -> c iff a -> b /\ c
for FDs (by definition).
But what about programmers who'd like that
C [x] y z yields the improvement y = [b], z =[b]
where
class C a b c | a -> b c
instance C a b b => C [a] [b] [b]
Isn't that precisely what you earlier said would happen with multi-range FDs?
Either I'm missing some difference or we're talking at cross-purposes.
My suggestion is that
"class C a b c | a -> b c" and "class C a b c | a -> b, a -> c" be both
treated as the former case, leading to both cases having the y=[b],z=[b]
improvement as above.
Misunderstanding. I see what you mean. Yes, I agree let's consider
a -> b, a -> c as equivalent to a -> b c (I argued the other direction
in my earlier email).
One subtle point (Tom and I just discussed).
It could happen that the programmer writes
class SuperCtxt => C a b c | a -> b
but there could be an implicit dependency a -> c
arising from the super class context SuperCtxt.
Hence, you suddenly get a -> b c.
The problem is to generate the proper improvement rules.
Well, it's not hard to generate these rules we just need to make
sure that the rules generated match the programmers intuition
how functional dependencies behave.
Martin
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe