Есть ли более приятный способ поднятия частичной функции в Scala?

StackOverflow https://stackoverflow.com/questions/4721391

Вопрос

Иногда я сталкиваюсь с следующей шаблоном, где у меня есть PartialFunction[SomeType,AnotherType], и хочу относиться к этому как к Function[SomeType,Option[AnotherType], например:

def f(s:SomeType):Option[AnotherType] = s match {
  case s1:SubType1 => Some(AnotherType(s1.whatever))
  case s2:SubType2 => Some(AnotherType(s2.whatever))
  case _ => None
}

Есть ли способ написать вышеупомянутую функцию таким образом, чтобы избежать случая по умолчанию и завершить результат в Some где это определено? Лучшее, что я придумал до сих пор:

def f(s:SomeType):Option[AnotherType] = pf.lift(s)
def pf:PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}

Есть ли способ сделать это без определения промежуточной функции? Я уже пробовал различные вещи в соответствии с следующим, но еще не имеет ничего общего:

def f:Function[SomeType,Option[AnotherType]] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}.lift
Это было полезно?

Решение

condOpt В объекте Scala.partialfunction. От Scaladoc:

def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }

Другие советы

Не столько ответ, как объяснение того, почему ответ Хуинхьла верен ...

Часть вашей путаницы в том, что вы пытаетесь def частичная функция. Все, что это делает, - это создать метод, который возвращает PartialFunction объект, когда вы можете также создать эту вещь напрямую:

val pf: PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}

Хотя я лично предпочитаю использовать тип подписания:

val pf = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]

В любом случае, вы должны указать, что такое тип ввода, поэтому вы должны дать точную подпись PartialFunction. Анкет Я знаю, что кажется, что это должно быть возможно сделать это, но, увы, это, к сожалению, не так!

Используя приписанную версию, вы можете определить и поднять все в одном месте:

val pf = ({
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]).lift

PartialFunction.condOpt Это лучшее решение, так как это позволяет выводам выполнять большую часть этой работы за вас, оставляя более чистый код :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top