2017-09-13 8 views
3

Cette compile bien:Pourquoi un littéral de fonction utilisé comme argument par défaut nécessite un type de paramètre?

def walk[X](a: X)(f: X => Boolean): Boolean = f(a) 

walk(1)(_ => true) 

Cette compile bien ainsi:

def walk(a: Int)(f: Int => Boolean = _ => true): Boolean = f(a) 

walk(1)() 

Cela ne signifie pas:

def walk[X](a: X)(f: X => Boolean = _ => true): Boolean = f(a) 

walk(1)() 

L'erreur est:

Error:(1, 38) missing parameter type

L'évidence w orkaround est d'utiliser (_: X) => true, mais pourquoi est-ce une erreur? Je pense que lorsque la deuxième liste de paramètres est en cours de traitement, tapez l'information obtenue à partir du premier devrait déjà être disponible?

Scala Testé avec 2.11.8 et 2.12.1

+0

Argh J'ai accidentellement retiré mon commentaire :) OK ouais, j'ai réalisé que trop, mais s'il vous plaît ne pas modifier pour mettre l'accent sur le problème (ou mieux encore, supprimer ces lignes tout à fait; problème dans la définition, pas l'invocation) – slouc

Répondre

2

On dirait this issue. Notez que c'est le cas uniquement pour les paramètres par défaut; ailleurs, l'inférence fonctionne bien.

Par exemple,

// works 
def walk1[X]: X => Boolean = _ => true 

// fails 
def walk2[X](f: X => Boolean = _ => true) = ???