
I think what you want is closed type families, as do I and many others :)
Unfortunately we don't have those.
On Mon, Feb 14, 2011 at 10:02 PM, Conal Elliott
Yes, it's one things that data families do. Another is introducing *new* data types rather than reusing existing ones. - Conal
On Mon, Feb 14, 2011 at 1:41 PM, John Meacham
wrote: Isn't this what data families (as opposed to type families) do?
John
Is there a way to declare a type family to be injective?
I have
data Z data S n
type family n :+: m type instance Z :+: m = m type instance S n :+: m = S (n :+: m)
My intent is that (:+:) really is injective in each argument (holding
On Mon, Feb 14, 2011 at 1:28 PM, Conal Elliott
wrote: the other as fixed), but I don't know how to persuade GHC, leading to some compilation errors like the following:
Couldn't match expected type `m :+: n' against inferred type `m :+: n1' NB: `:+:' is a type function, and may not be injective
I realize that someone could add more type instances for (:+:), breaking injectivity.
Come to think of it, I don't know how GHC could even figure out that the two instances above do not overlap on the right-hand sides.
Since this example is fairly common, I wonder: does anyone have a trick for avoiding the injectivity issue?
Thanks, - Conal
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
_______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users