Scala: когда именно требуются типы параметров функции? - PullRequest
15 голосов
/ 03 августа 2011

Существует множество способов определения функций в Scala, что приводит к путанице относительно того, когда требуются именно типы параметров функций.Я обычно начинаю с самого простого определения и продолжаю свой путь до тех пор, пока ошибки компилятора не исчезнут.Я бы скорее понял, как это работает.

Например:

_ + _

(x, y) => x + y

(x: Int, y: Int) => x + y

def sum(x: Int, y: Int) = x + y // as pointed out, this is a method,
                                // which not a function

Бонусные баллы за ссылку на документацию.

Ответы [ 2 ]

17 голосов
/ 03 августа 2011

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

Либо они взяты из справочной части:

val function: (Int, Int) => Int = _ + _

или от части объекта:

val function = (x: Int, y: Int) => x + y

на самом деле не имеет значения. (в Скале!)

Я знаю, что ваш вопрос касается функций, но вот аналогичный пример, иллюстрирующий вывод типа Scala:

// no inference
val x: HashMap[String, Int] = new HashMap[String, Int]()
val x: HashMap[String, Int] = new HashMap[String, Int]

// object inference
val x: HashMap[String, Int] = new HashMap()
val x: HashMap[String, Int] = new HashMap
val x: HashMap[String, Int] = HashMap() // factory invocation

// reference inference
val x = new HashMap[String, Int]()
val x = new HashMap[String, Int]
val x = HashMap[String, Int]() // factory invocation

// full inference
val x = HashMap("dog" -> 3)

РЕДАКТИРОВАТЬ По запросу я добавляю регистр функций высшего порядка.

def higherOrderFunction(firstClassFunction: (Int, Int) => Int) = ...

можно назвать так:

higherOrderFunction(_ + _) // the type of the firstClassFunction is omitted

Но это не особый случай. Тип ссылки явно упоминается. Следующий код иллюстрирует похожий пример.

var function: (Int, Int) => Int = null
function = _ + _

Это примерно эквивалентно случаю функции высшего порядка.

5 голосов
/ 03 августа 2011

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

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