
Wren ng thornton wrote:
It compiles just fine with (DeriveType A b => b -> b) after all, which resolves directly to (B -> B)
That's not the case: simpleNarrow :: DeriveType A b => b -> b simpleNarrow = id Couldn't match expected type `b' (a rigid variable) against inferred type `B' `b' is bound by the type signature for `simpleNarrow' ... When using functional dependencies to combine DeriveType A B, arising from the instance declaration ... DeriveType A b, arising from is bound by the type signature for `simpleNarrow' ... I think Bryan got the order in which type inference/checking works wrong. The dependency is not "resolved" before calculating the type as he suggested.
*Main> someDestructor (SomeConstructor undefined undefined :: ComplexType A) B
Why not this: *Main> someDestructor (SomeConstructor A B) B
But if you have actual values rather than just unit types, note that this won't work:
instance DeriveType A B where someDestructor (SomeConstructor _ b) = b
I couldn't understand the sentence "actual values rather than unit types". What do you have in mind? P.