Зачем мне нужна функция с карри, чтобы можно было передавать функциональные литералы с коротким синтаксисом заполнителя? - PullRequest
2 голосов
/ 14 февраля 2012

Учитывая это определение:

class Foo(var x: String) {}

object Helper {
  def model[T](get: ⇒ T, set: T ⇒ Unit) : Model[T] = new Model[T] {
    override def getObject(): T = get

    override def setObject(obj: T) { set(obj) }
  }
}

Я пытаюсь позвонить model так:

val f = new Foo("initial")
val stringModel = model(f.x, f.x = _)

Но это не работает, компилятор дает мне это, жалуясь на подчеркивание:

missing parameter type for expanded function ((x$1) => f.x = x$1)

Если я изменю определение model, чтобы использовать два списка параметров, подобных этому:

def model[T](get: ⇒ T)(set: T ⇒ Unit) // rest is unchanged

Тогда я могу назвать это так:

model(f.x)(f.x = _)

Что я нахожу хорошим и лаконичным. Я не против сделать это, хотя это усложняет перегрузку метода. Однако я хотел бы понять, почему второй вариант работает, а первый - нет?

1 Ответ

5 голосов
/ 14 февраля 2012

Второй вариант работает, потому что Scala уточняет блок типов своих параметров блоком параметров.Если вы не укажете тип входного параметра для функции, возможно, он изменит тип T, который был выведен на основе первого параметра.Если вы отправите его в отдельный блок параметров, Scala уже определит, каким должно быть T к тому времени, когда оно попадет в этот блок, поэтому оно заполняет единственно возможное значение для типа аргумента функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...