Scalaで部分的な機能を持ち上げるより良い方法はありますか?
-
12-10-2019 - |
質問
私は時々次のパターンに出くわします。 PartialFunction[SomeType,AnotherType]
, 、そしてそれをaとして扱いたい 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で。スカラドックから:
def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }
他のヒント
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
しかし、推測者がこの作業の大部分をあなたのために行うことができるので、よりクリーンなコードを残すことができるので、より良い解決策です:)
所属していません StackOverflow