/ / Les fonctions d'ordre supérieur surchargées / Scala provoquent une erreur de type - scala, types, surcharge, méthode-surcharge

Les fonctions d'ordre supérieur surchargées par Scala provoquent une erreur de type - scala, types, surcharge, surcharge de méthode

J'ai une méthode surchargée définie comme suit:

def g(f: () ⇒ Double): Object = null
def g(f: Double ⇒ Double): Object = null
def g(f: (Double, Double) ⇒ Double): Object = null

def h(f: (Double, Double) ⇒ Double): Object = null

Tandis que h(math.max _) fonctionne comme prévu, appelant g(math.max _) me donne l'erreur "La méthode surchargée ... ne peut pas être appliquée à ((Int, Int) => Int)". Il semble que le compilateur a choisi la version Int de math.max au lieu de la version double.

Comment puis-je appeler ma méthode surchargée g avec math.max en paramètre? Ce serait un bonus supplémentaire si je pouvais appeler g(math.max) sans le soulignement.

Réponses:

3 pour la réponse № 1

Vous avez rencontré une heuristique utilisée par le compilateurpour éviter des recherches de types exponentiellement complexes. Lorsque la méthode est surchargée, elle essaie de ne pas être ambiguë en fonction du type de l'argument. Malheureusement, l'argument est aussi surchargé. Au lieu d’essayer des possibilités, il saisit simplement le premier qui vient à l’esprit et cela ne fonctionne pas.

Vous pouvez le tromper en cherchant plus en demandant de la bonne façon:

g(math.max(_,_))

Notamment, il est maintenant clair pour le compilateur qu’il recherche un Function2 et que - même si toutes les versions de max doit être Function2! - est suffisant pour que le compilateur recherche une correspondance (et elle correspond à Double avec Double).


1 pour la réponse № 2

Quelques minutes après avoir posté ceci, j'ai découvert cette solution:

g(math.max: ((Double, Double) => Double))

Je suis toujours curieux de savoir pourquoi Scala a ce problème dans le premier cas.