8

ステートメントを使用してPartialFunction例外を作成する方法はありますか?case

気になるのは、次のように表現したいからです(scala疑似アヘッド!)...

val bi = BigInt(_)
if (bi.isValidInt) bi.intValue

...部分関数として、および実行

val toInt : PartialFunction[String, Int] = {
    case s if BigInt(s).isValidInt => BigInt(s).intValue
}

二度作成するので冗長に思えますBigInt

4

5 に答える 5

5

質問を理解しているかどうかわかりません。しかし、ここに私の試みがあります: エクストラクタを作成してみませんか?

object ValidBigInt {
  def unapply(s: String): Option[Int] = {
    val bi = BigInt(s)
    if (bi.isValidInt) Some(bi.intValue) else None
  }
}

val toInt: PartialFunction[String, Int] = {
  case ValidBigInt(i) => i
}

もう1つのオプションは次のとおりです(そして、リテラルPartialFunction以外で作成できるかどうかという質問に答えるかもしれません):case

val toInt = new PartialFunction[String, Int] {
  def isDefinedAt(s: String) = BigInt(s).isValidInt
  def apply(s: String) = BigInt(s).intValue
}

ただし、部分関数の考え方は部分的にしか定義されていないため、最終的には冗長なことを行うことになります.big intを作成して有効かどうかをテストし、関数アプリケーションでbig intを作成する必要があります.また...

からの結果をいくらかキャッシュすることで、これを回避しようとするプロジェクトをGithubで見ましたisDefinedAt。ベンチマークに行くと、デフォルトの Scala 実装よりも遅いことがわかります:)

isDefinedAtしたがって、 vsの二重の性質を回避したい場合は、 as 結果applyを提供する (完全な) 関数をそのまま使用する必要があります。Option[Int]

于 2011-04-14T19:37:58.307 に答える
4

リフト/アンリフトを探していると思います。lift は部分関数を受け取り、それを Option を返す関数に変換します。Unlift は、オプションを返す 1 つの引数を持つ関数を取り、部分関数を返​​します。

import scala.util.control.Exception._

scala> def fn(s: String) = catching(classOf[NumberFormatException]) opt {BigInt(s)}
fn: (s: String)Option[scala.math.BigInt]

scala> val fnPf = Function.unlift(fn)
fnPf: PartialFunction[String,scala.math.BigInt] = <function1>

scala> val fn = fnPf.lift
fn: String => Option[scala.math.BigInt] = <function1>

密接に関連しているため、cond と condOpt に関する情報については、この回答も参照してください。

scala> import PartialFunction._
import PartialFunction._

scala> cond("abc") { case "def" => true }
res0: Boolean = false

scala> condOpt("abc") { case x if x.length == 3 => x + x }
res1: Option[java.lang.String] = Some(abcabc)
于 2011-11-15T02:35:19.047 に答える
3

PartialFunction必要に応じて、 「手書き」を書き出すことができます。

object pf extends PartialFunction[Int,String] {
  def isDefinedAt(in: Int) = in % 2 == 0

  def apply(in: Int) = {
    if (in % 2 == 0) 
      "even" 
    else 
      throw new MatchError(in + " is odd")
}
于 2011-04-15T00:36:54.127 に答える
1

わかりました、これを手に入れました

import java.lang.NumberFormatException
import scala.util.control.Exception._

val toInt: PartialFunction[String, Int] = {
  catching(classOf[NumberFormatException]) opt BigInt(_) match {
    case Some(bi) if bi.isValidInt => bi.intValue
  }
}
于 2012-03-06T16:34:44.897 に答える
0

これはどう?

val toInt: PartialFunction[String, Int] = (s: String) => BigInt(s) match {
  case bi if bi.isValidInt => bi.intValue
}
于 2011-09-15T19:12:47.000 に答える