Отсутствует тип параметра для расширенной функции при создании частично примененной функции - PullRequest
0 голосов
/ 03 января 2019

Я новичок в Scala и читал о частично примененных функциях в Scala. У меня есть общая функция "wrap", которая может объединять три строки.

def wrap(prefix: String)(html: String)(suffix: String) = prefix + html + suffix

Когда я пытаюсь создать специализированную функцию, подобную этой

val foo = wrap(_)("Hello")(_)

Сбой с ошибкой пропущенного типа параметра, но работает, если я предоставляю тип для первого аргумента, как это

val foo = wrap(_:String)("Hello")(_)

Мои вопросы:

  1. Почему я должен указывать тип избыточно? Я уже предоставил это в общем определении обтекания.

  2. Почему для последнего аргумента не требуется тип?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

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

  def wrap(prefix: String)(html: String)(suffix: String) = prefix + html + suffix
  def wrap(prefix: Int)(html: String)(suffix: String) = prefix.toString + html + suffix

  val foo = wrap(_: String)("Hello")(_: String)
  val foo1 = wrap(_)("Hello")(_)     // compilation Error: Cannot resolve method 'wrap'

Итак, вам нужно явно указать типпараметр, как показано ниже:

  val foo = wrap(_: String)("Hello")(_: String)
  val foo1 = wrap(_: Int)("Hello")(_: String)

или явно указать тип возвращаемого значения:

  val foo: (String, String) => String = wrap(_)("Hello")(_)
  val foo1: (Int, String) => String = wrap(_)("Hello")(_)
0 голосов
/ 03 января 2019

Как вы обнаружили, вам нужно дать компилятору немного больше информации о типах, прежде чем он сможет работать с типом foo.Вы можете указать типы аргументов:

val foo = wrap(_: String)("Hello")(_: String)

или тип результата

val foo: (String, String) => String = wrap(_)("Hello")(_)

Указание одного типа не компилируется в моей сборке с использованием 2.12.7

val foo = wrap(_: String)("Hello")(_) // Does not compile
...