9

合計関数は部分関数の特殊なケースなので、部分関数が必要なときに関数を返すことができるはずだと思います。

例えば、

def partial : PartialFunction[Any,Any] = any => any

もちろん、この構文はコンパイルに失敗します。私の質問は、これを行うことは可能ですか?もしそうなら、構文を正しくするために何をする必要がありますか?

私は次のことができることを知っていますが、これは好奇心からの質問です

def partial : PartialFunction[Any,Any] = {
  case any => any
}
4

5 に答える 5

12

メソッドを使用できますPartialFunction.apply

val partial = PartialFunction[Any,Any]{ any => any }

短くしたい場合は、このメソッドをインポートできます。

import PartialFunction.{apply => pf}
val partial = pf[Any,Any]{ any => any }
于 2014-01-02T20:32:39.437 に答える
4

AFunctionNは全関数ではありません:

val evilFun: Int => Int = n => if (n < 0) sys.error("I'm evil!") else n

つまり、すべての Scala 関数は部分関数です。したがってPartialFunction、 を介して部分関数を検査し、 を介して部分関数をisDefinedAtチェーンする方法を提供しますorElse

PartialFunction完全に取り除き、with 関数リテラルと持ち上げられたメソッドをいつものように実装isDefinedAtするレベルにすることは理にかなっている可能性があります。FunctionNisDefinedAttrue

于 2014-01-02T20:45:29.397 に答える
1

概念が切り替わっている可能性があると思います。

PartialFunction[-A, +B] extends (A) ⇒ B 

ただし、サブクラスはより具体的であるため、サブクラスが必要な場所でスーパークラスの値を使用することはできません。Function1したがって、 を返すように型指定されたメソッドから値を返すことはできませんPartialFunction

ただし、逆に機能します。スーパークラスが必要な場所でサブクラスを使用できます。したがって、PartialFunctiona を返すように型指定されたメソッドから aを返すことができますFunction1(同じ型パラメーターを使用)。

scala> def f: Any => Any = { case a => "foo" }
f: Any => Any

scala> f(1)
res0: Any = foo

この特定のケースでは、いつでも aFunctionを aPartialFunctionに変換できるため、PartialFunction.applyメソッドが提供されます。

def apply[A, B](f: A => B): PartialFunction[A, B] = { case x => f(x) }
于 2014-01-06T16:00:47.190 に答える
-4

部分関数を関数に変える「リフト」と呼ばれる便利なメソッドを探していると思います1(オプションでラップされた結果を返す)。

http://www.scala-lang.org/api/current/index.html#scala.PartialFunction

分類学について言えば。私はあなたがそれを逆にしたと思います-部分関数はfunction1のサブタイプです

于 2014-01-02T20:14:38.813 に答える