Частичная функция в scala

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

val divide: PartialFunction[Int, Int] = {
    case d: Int if d != 0 => 42 / d
}

Здесь div - это переменная, тип которой - PartialFunction [Int, Int], что является признаком. Меня смущает часть RHS. Так как тип переменной div: PartialFunction [Int, Int], ее необходимо создать с помощью нового ключевого слова. Я не уверен, что это за синтаксис. Плюс как функция isdefined () автоматически определяется выше? (isDefined () кажется доступным; но он там скрыт).

Может кто-нибудь, пожалуйста, помогите.


person user3103957    schedule 26.10.2020    source источник
comment
Необязательно создавать экземпляры объектов с помощью new, компилятор может создавать объекты непосредственно для литералов (_2 _, _ 3_) или даже когда он создает функцию (которая является просто экземпляром класса Function). В этом случае он создает экземпляр PartialFunction, используя этот синтаксис.   -  person Tim    schedule 26.10.2020


Ответы (1)


Правая часть - это функциональный литерал в падежах.

Это литерал, точно так же, как Int, Char, String не имеют ключевого слова new перед литералом.

Функция в case имеет синтаксис

{
  case ... => ...
  (optionally more cases)
}

Ожидаемый тип должен быть полностью известен. Если ожидается PartialFunction, оно принимается как PartialFunction. В противном случае принимается как Function1

Для варианта PartialFunction это isDefinedAt определяется шаблонами корпусов.

person Martijn    schedule 26.10.2020
comment
Я не думаю, что это должен быть Function1 - он также может расширяться до функции с несколькими параметрами. - person user; 26.10.2020
comment
Спасибо за ответ! Я пытаюсь сделать следующее ... val x = {case _ = ›Nothing} ad Я получаю сообщение об ошибке ... Отсутствует тип параметра для расширенной функции .. - person user3103957; 26.10.2020
comment
Да, я забыл, вы можете использовать функциональные литералы только в том случае, если ожидаемый тип полностью известен. val x: Any => String = { case _ => "Nothing" } будет работать - person Martijn; 26.10.2020
comment
У меня есть еще один вопрос .. Когда я пишу, val x = Int = ›Int = {case x =› 2 * x} OR val x: Int = ›Int = 2 * _. Оба работают. Но когда я это сделаю: val y: PartialFunction [Int, Int] = {case x = ›2 * x} ИЛИ val y: PartialFunction [Int, Int] = 2 * _ работает только первый случай. Второй случай ошибочен. Не могли бы вы помочь. хотя тип ввода является неявным через объявление PartialFunction [Int, Int]. - person user3103957; 31.10.2020
comment
2 * _ всегда анализируется только как Function литерал, но никогда как PartialFunction литерал. Только литералы в случаях анализируются как литералы PartialFunction (если они ожидаются и тип аргумента полностью известен). - person Martijn; 01.11.2020