
Robert Dockins wrote:
To make this work, you're going to have to convince the compiler to accept "overlapping instances" and then make sure they don't overlap :) In the second instance, what you really want to say is "instance c [a] c, only where c is not an application of (->)". As I recall, there is a way to express such type equality/unequality using typeclasses, but I don't remember how to do it offhand.
Now that I think about it more, I see what you are saying. And I think we can be a little more general than "c is not an application of (->)". A better statement might be "c is not a function application which takes an 'a' as the first argument". That should allow us to have a function of type Int->Int->Double->String return a function Double->String when applied to a list of Int's. So in Prolog... :- op(1000,xfy,=>). app(A=>B,[A],C) :- app(B,[A],C). app(C,[A],C) :- not(isfuncwithhead(C,A)). isfuncwithhead(A=>B,A). ...Now I just need to figure out how to represent "not" without "cut". I'll take a look at what Oleg has done. Thanks, Greg Buchholz