Почему PartialFunction <: Функция в Scala?

Поместите h1 и h2 в контейнер с идентификатором container, затем:

#container {
    display: flex;
    justify-content: space-beteen;
}
44
задан jpalecek 4 June 2009 в 11:34
поделиться

2 ответа

Потому что в Scala (как и в любом полном языке Тьюринга) нет гарантии, что функция является полной.

val f = {x : Int => 1 / x}

Эта функция не определена в 0. PartialFunction - это просто функция, которая обещает сообщить вам, где она не определена. Тем не менее, Scala позволяет достаточно легко делать то, что вы хотите

def func2Partial[A,R](f : A => R) : PartialFunction[A,R] = {case x => f(x)}

val pf : PartialFunction[Int, String] = {case 1 => "one"} 

val g = pf orElse func2Partial{_ : Int => "default"}

scala> g(1)
res0: String = one

scala> g(2)
res1: String = default

Если хотите, вы можете сделать func2Partial неявным.

34
ответ дан 26 November 2019 в 22:18
поделиться

PartialFunction имеет методы, которые Function1 нет, следовательно, это подтип. Это методы isDefinedAt и orElse .

Ваша настоящая проблема в том, что PartialFunction иногда не выводятся, когда вы действительно этого хотите. Я надеюсь, что это будет рассмотрено в будущем. Например, это не работает:

scala> val pf: PartialFunction[String, String] = { case "a" => "foo" }
pf: PartialFunction[String,String] = <function>

scala> pf orElse { case x => "default" }
<console>:6: error: missing parameter type for expanded function 
((x0$1) => x0$1 match { case (x @ _) => "default" })

Но это работает:

scala> pf orElse ({ case x => "default" } : PartialFunction[String,String])
res5: PartialFunction[String,String] = <function>

Конечно, вы всегда можете сделать это:

scala> implicit def f2pf[T,R](f: Function1[T,R]): PartialFunction[T,R] = 
  new PartialFunction[T,R] { 
    def apply(x: T) = f(x)
    def isDefinedAt(x: T) = true 
  }
f2pf: [T,R](f: (T) => R)PartialFunction[T,R]

И теперь это больше похоже на ваше желание:

scala> pf orElse ((x: String) => "default")
res7: PartialFunction[String,String] = <function>

scala> println(res7("a") + " " + res7("quux"))
foo default
17
ответ дан 26 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: