Suppose you have a multimethod + of two arguments, and you want to
dispatch on both of them:
(defmulti + (fn [x y] [(type x) (type y)]))
You can then write implementations such as
(defmethod + [java.lang.Integer java.lang.Double] ...)
You can also provide a default implementation, of course:
(defmethod + :default ...)
But suppose you want to provide a default for one argument only?
Something like
(defmethod + [java.lang.Integer ::any] ...)
i.e. a multimethod that matches all invocations in which the first
argument is an integer. I don't currently see a simple way to do
this. For types in the Java class hierarchy, you can use Object as
the parent of all types, but there is nothing equivalent in Clojure's
ad-hoc hierarchies.
Would it be a good idea to provide the possiblity to add a universal
parent to hierarchies? Or would that create any problems? Is there
another solution for the situation I described?
Konrad.
> You could use multiple multi-methods:
...
Not pretty, as you said, but also not quite the same in behaviour as
a single multimethod dispatching on both arguments. Multiple dispatch
can be made symmetric in the arguments, whereas a chain of
multimethods always implies a dispatch hierarchy. In your example,
the type of the first argument always dominates.
Konrad.
>> Providing a :default implementation for multimethods is a very common
>> and useful technique, but it is really useful only for multimethods
>> that dispatch on a single argument.
>
> I disagree about that. No dispatch value, composite or not, is still a
> valid concept.
True, for reasons other than a default in a type hierarchy.
>> But suppose you want to provide a default for one argument only?
>> Something like
>>
>> (defmethod + [java.lang.Integer ::any] ...)
>>
>
> I think it is best to think about this differently than :default, it's
> more about a universal parent than about a missing dispatch value.
It could be seen from both points of view (universal parent in the
hierarchy, or a partial match with a default), but I agree that the
universal parent point of view makes more sense.
>> Would it be a good idea to provide the possiblity to add a universal
>> parent to hierarchies? Or would that create any problems? Is there
>> another solution for the situation I described?
>
> Yes, don't know, and no. I briefly looked at this but only got as far
> as to decide Object couldn't be the universal parent. I think you have
> to reserve a value that will never otherwise be used.
Object would indeed not work, the universal parent would have to be
even above Object.
I just looked at the implementation of hierarchies and I have the
impression that this should be rather simple to implement. I will try
and see how it works out in practice.
Konrad.