5

私は時々次のパターンに出くわします、そこで私は本質的にを持っていて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
4

2 に答える 2

7

condOptオブジェクトscala.PartialFunctionで。スカラドックから:

def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }
于 2011-01-18T07:50:52.647 に答える
4

huynhjlの答えが正しい理由の説明として、あまり答えではありません...

あなたの混乱の一部は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ただし、推論器がこの作業のほとんどを実行できるため、よりクリーンなコードを残すことができるため、より良い解決策です:)

于 2011-01-18T10:13:15.917 に答える