2016-06-28 3 views
1

Можно ли вызвать функцию apply непосредственно из результата метода, который принимает второй список параметров (с неявным аргументом)? Даже с круглыми скобками в логическом месте я получаю ту же ошибку типа компиляции, которая указывает, что она не анализирует ее, как ожидалось.Ассоциативность операторов Scala (2-й список параметров)

val x = Map(1 -> 2, 2->4, 3-> 6) //1 

val y = x.map(_.swap) //2 

y(4) //3 

x.map(_.swap)(4) //4 

((x.map(_.swap))(4) //5 

Line 4 имеет смысл не разобрать, так как (4) легко, как представляется, второй список параметров для отображения(), но строка 5, есть множество() 's вокруг .map выражения , но он все еще связывает (4) с .map, а не с результатом .map().

Есть ли способ сделать строки 2 и 3 в одном выражении?

EDIT: Я знаю, что .apply() - это то, что компилятор будет вставлять. Есть ли способ сделать это без ручного обезжиривания?

ответ

0

Да, есть несколько возможных решений. Все работы либо удовлетворяют неявному списку параметров, либо дают компилятору подсказку о том, что это выражение закончилось, а значение (), прочитанное применимо, действительно является методом apply-method и не имеет второго списка аргументов.

1. Вызов .apply()

scala> Map(1 -> 2, 2 -> 4, 3 -> 6).map(_.swap).apply(4) 
res7: Int = 2 

2. Обеспечение неявное непосредственно

Другой вариант поставляет неявное непосредственно

Пример с пробой

import scala.collection.breakOut 

scala> List(1).map(_ + 1)(breakOut)(0) 
res38: Int = 2 

Я считаю, что вообще проблема заключается в следующем: вы должны заполнить, чтобы обеспечить им icit для CanBuildFrom для правильной работы или явно указать, что вы хотите вызвать apply, а не заполнять второй список параметров.

Вы можете найти более подробную информацию о: http://docs.scala-lang.org/tutorials/FAQ/breakout. В отличие от имени работает secCanBuildFrom.

+0

Я знаю, что «применимо». Я искал что-то, что не требует ручного «обезжиривания»; другими словами, что-то, что следует за нормальным составом выражений (как объединение строк 2 и 3) – eques

+0

'(breakOut)' не будет работать для примера OP, потому что «Карта» потеряна. Он превращается в Seq кортежей. – jwvh

+0

пример - пример; то есть не важно, что это «Карта» или что '.map()' вызывается. Важно только, что это функция, которая имеет второй список параметров с неявным аргументом, и тип результата поддерживает 'apply' – eques