6

私は比較的 Scala の初心者であり、Option を返す関数または PartialFunction のいずれかを使用して実行できるように思われる実装を進める方法についてアドバイスをお願いします。関連するすべての投稿を見つけましたが (質問の下部を参照)、これらには PartialFunction の使用または一方から他方への変換の技術的な詳細が含まれているようです。「状況がX、Y、Zの場合、Aを使用するか、Bを使用しますが、Cも検討してください」というタイプの回答を探しています。

私の使用例は、パス ファインダーのライブラリを使用した場所間のパス検索です。場所のタイプがLで、パスのタイプがPで、目的のパス検索結果がIterable[P]. パッチの検索結果は、すべてのパス ファインダー (Google マップのようなものでは、自転車、車、徒歩、地下鉄など) にパスの提案を求めることによって組み立てる必要があります。終了位置のペア。

これについては、次の 2 つの方法があるようです。

(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 likefinders.filter( _.isDefined( (l1,l2) ) ).map( _.apply( (l1,l2)) )`として定義します。

返される関数を使用すると結果の二重評価が回避されるように思われるOption[P]ため、結果をキャッシュしない限り、高価な計算の場合はこれが望ましい場合があります。また、単一の引数を期待しているのOptionに対し、任意の入力署名を持つことができるように見えます。PartialFunctionしかし、Scala ライブラリとのやり取りなど、直接的ではなく、より「全体像」に関する考慮事項について、実務経験のある人からの意見を聞くことに特に興味があります。を使用するPartialFunctionと、コレクション API の特定のメソッドを利用できるようになり、他の方法で成果が得られる可能性がありますか? そのようなコードは一般的により簡潔になりますか?

関連するが異なる質問:

4

2 に答える 2

3

Optionユースケースにより適しているように感じます。

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

しかし、あなたの場合は、特定の(l1,l2)場所のタプルで問題が発生し、その後、いくつかの作業を行うようです...

自分でたくさん書いていることに気付いた{case (L,M) => ... case (P,Q) => ...}場合は、部分関数の方が適していることを示している可能性があります。

それ以外の場合、オプションは残りのコレクションでうまく機能し、(a)提案の代わりに次のように使用できます。

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

内で理解pはに持ち上げられるので、電話をかけたり、結果なしでファインダーをスキップしたりするTraversable必要はありません。filterisDefinedget

于 2011-12-01T05:50:12.760 に答える
3

あまり知られていませんが、Scala 2.8 以降では、collectコレクションに対してメソッドが定義されています。 collectに似てfilterいますが、部分的な機能を取り、説明したセマンティクスを持っています。

于 2011-12-01T12:42:17.760 に答える