2011-12-01 11 views
6

私は相対的なスカラの初心者で、Optionを返す関数またはPartialFunctionを使用して実行できるような実装を進める方法についていくつかアドバイスをしたいと思います。私は見つけることができるすべての関連記事を読んだことがありますが(質問の一番下を参照)、PartialFunctionを使用するか、または一方を他方に変換する技術的な詳細が含まれているようです。私はタイプの答えを探しています "状況がX、Y、Zなら、A else Bを使うだけでなく、Cも考慮する"。スカラ:オプションを返す関数の選択

この例の使用例は、パス・ファインダのライブラリを使用する場所間のパス検索です。場所がタイプLであり、パスがタイプPであり、所望のパス検索結果がIterable[P]であるとする。パッチの検索結果は、特定の開始/終了時刻に定義されている場合とされていない場合がある、経路候補のすべての経路発見子(Googleマップのようなものは自転車、車、歩行者、地下鉄など)エンド・ロケーション・ペア。

あり、このことについてに行くには二つの方法のように見える:

(a)のf: (L,L) => Option[P]としてパスファインダーを定義しfinders.map(_.apply(l1,l2)).filter(_.isDefined).map(_.get)

のようなものを経由して結果を取得する(B)f: PartialFunction[(L,L),P] and then get the result via something likeとしてパスファインダーを定義します

Option[P]を返す関数を使用しているようですが、結果が二重に評価されることはありません。そのため、高価な計算では、結果がキャッシュされない限り、これが好ましい場合があります。 Optionのように、任意の入力署名を持つことができますが、PartialFunctionは単一の引数を期待しているようです。しかし、私は特にScalaライブラリとのやりとりのように、あまり直接的ではなく、より大きな「大きな画像」を考慮する現実的な経験を持つ人物からの意見に興味があります。 PartialFunctionを使用すると、他の方法で恩恵を受けるコレクションAPIの特定のメソッドを利用できるようにする上で、大きなメリットがありますか?そのようなコードは一般的に簡潔でしょうか?

関連が異なる質問:

答えて

3

それは感じますOptionのようにあなたのユースケースに合っているかもしれません。

私が解釈しているのは、部分関数は入力範囲でうまく機能するということです。したがって、(SanDiego,Irvine)gの間にfが定義されている場合は、を実行して、(SanDiego,Irvine)(Paris,London)の組み合わせ入力で定義された関数を得ることができます。

しかし、それはそうあなたのケースでは、物事は、与えられた(l1,l2)場所タプルのために起こり、その後、あなたはいくつかの作業を行う...

あなた自身が{case (L,M) => ... case (P,Q) => ...}をたくさん書いて見つけた場合、それは部分的に機能する徴候である可能性がありますよりフィット感があります。あなたはドンので、」、理解p用以内

val processedPaths = for { 
    f <- finders 
    p <- f(l1, l2) 
} yield process(p) 

Traversableに持ち上げられ:

は、そうでない場合のオプションは、コレクションの残りの部分でうまく動作し、代わりにあなたの(a)の提案のこのように使用することができますfilterisDefinedまたはgetに電話をしても結果なしのファインダーをスキップする必要があります。

3

これはよく知られているわけではありませんが、2.8スカラのコレクションにはcollectメソッドが定義されています。 collectfilterと似ていますが、部分的な機能を持ち、記述したセマンティクスを持っています。