質問

私は相対的なScalaの初心者であり、関数返品オプションまたは部分機能を使用して実行できると思われる実装を進める方法についてのアドバイスをご希望です。私が見つけることができるすべての関連する投稿を読んだことがあります(質問の底を参照)が、これらには部分機能を使用したり、一方を他方に変換することの技術的な詳細が含まれているようです。 「状況がx、y、zの場合、else 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ライブラリとの相互作用など、即時の、より大きな「全体像」の考慮事項について、実際の経験を持つ人からの話を聞くことに興味があります。 aを使用します PartialFunction 他の方法で報われる可能性のあるコレクションAPIの特定の方法を利用可能にすることに大きな利点がありますか?そのようなコードは一般により簡潔になりますか?

関連するが異なる質問:

役に立ちましたか?

解決

みたいな 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, 、だからあなたは電話する必要さえありません filter, isDefined また get 結果なしでファインダーをスキップする。

他のヒント

それはそれほどよく知られているわけではありませんが、2.8 Scalaには collect コレクションで定義されている方法。 collect と類似しています filter, 、しかし、部分的な関数を取り、あなたが説明するセマンティクスを持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top