3 votes

Pourquoi un littéral de fonction utilisé comme argument par défaut nécessite-t-il un type de paramètre ?

Cela compile bien :

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

walk(1)(_ => true)

Cela compile bien aussi :

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

walk(1)()

Ce n'est pas le cas :

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

walk(1)()

L'erreur est :

Erreur :(1, 38) type de paramètre manquant

La solution de contournement évidente consiste à utiliser (_: X) => true mais pourquoi cette erreur ? Je pensais que lorsque la deuxième liste de paramètres est traitée, les informations de type obtenues à partir de la première liste devraient déjà être disponibles ?

Testé avec Scala 2.11.8 et 2.12.1

2voto

slouc Points 5393

On dirait que cette question . Notez que ce n'est le cas que pour les paramètres par défaut ; ailleurs, l'inférence fonctionne parfaitement.

Par exemple,

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X