Scala named и аргументы по умолчанию в сочетании с неявными параметрами

Рассмотрим следующее:

def f(implicit a: String, y: Int = 0) = a + ": " + y
implicit val s = "size"
println(f(y = 2))

Последнее выражение вызывает следующую ошибку:

not enough arguments for method f: (implicit a: String, implicit y:
Int)java.lang.String. Unspecified value parameter a.

Однако, если вы укажете значение по умолчанию для неявного параметра a, нет проблемы:

def f(implicit a: String = "haha!", y: Int = 0) = a + ": " + y
implicit val s = "size"
println(f(y = 2))

Но последняя строка печатает

haha!: 2

в то время как я ожидал

size: 2

Таким образом, неявное значение 's' не подбирается. Если вместо этого вы не укажете какие-либо параметры f и просто вызовите

println(f)

то неявное значение будет получено, и вы получите

size: 0

Может кто-то пролить свет на то, что происходит здесь?

Ответ 1

Try

println(f(y = 2, a = implicitly))

Как только вы начинаете указывать параметры, вы не можете вернуться. Это либо весь список неявный, либо ни один из них не является.

Ответ 2

Неявные параметры должны идти отдельно - сначала, а в конце определения метода - во-вторых. Вот так:

def f(y: Int = 0)(implicit a: String) = a + ": " + y
implicit val s = "size"
println(f(y = 2))

Выходы

size: 2

Ответ 3

В соответствии с тем, что сказал jsuereth, вы можете определить свою функцию как

def f(a: String = implicitly, y:Int = 0) = a + ": " + y

Или так, как я привык видеть,

def f(y:Int = 0)(implicit a: String) = a + ": " + y