16

ここにリンクされている質問から、Scala での Union のこの実装を見つけました。

def union(a: Set, b: Set): Set = i => a(i) || b(i)

Set は次のタイプの関数です。

type Set = Int => Boolean

ここで、Scala では関数が Int から Boolean にマップされることを理解し、このステートメントがどのように実行されるかをさらに理解しました。

a(i) || b(i)

しかし、私が理解していないのは、ここでの「i」が何であるかです。それはどこから来たのですか?セット間で一致が見つかった場合は true を返します。実際に一致する場合は、どこでフィルタリングすればよいでしょうか。

4

4 に答える 4

1

セット間で一致が見つかった場合は true を返します。実際に一致する場合は、どこでフィルタリングすればよいでしょうか。

union2 つのセット間で一致が見つからない場合、両方のセットの値を含む新しいセットを作成します。例:

val a = (i) => i == 2 // a contains 2 as a(2) == True
val b = (i) => i == 5 // b contains 5 as b(5) == True
val u = union(a, b)   // u contains 2 and 5 as u(2) == True and u(5) == True

したがって、「フィルタリング」は途中で発生します。この関数は、特定のものを除外して各セットを反復処理するのではなく、後で実行して実際の値を照会できる 2 つの関数の組み合わせを返すだけです。

ユニオンの値を照会する例:

val a = (i) => i == 2
val b = (i) => i == 5
val u = union(a, b)

for(i <- 1 to 10 if u(i)) yield i     // returns Vector(2, 5)

はい、推測によって値をチェックする必要があるため、これは値をセットに格納する最適な方法ではありませんが、非常に複雑なコードを記述せずに関数を組み合わせて複雑な機能を追加する方法を示す良い方法です。

于 2013-10-06T12:45:05.670 に答える