1

私はこの def メソッドを理解しようとしています:

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

質問で言及されているもの:Scala set function

これは私の理解です:

このメソッドは、タイプ Set の 2 つのパラメーター (a & b) を取ります。2 つのセット a & b の結合である Set が返されます。

ここで私は特に混乱しています: Set = i => a(i) || イ(イ)

返された Set 自体には、 Set a & b の「or」が含まれています。Set 'i' は暗黙の for ループによって取り込まれていますか?

「i」はセットであるため、「セットのセット」が可能である理由は、バックグラウンドで生成されているもののようなものです:

a(i) || b(i) 
becomes
SetA(Set) || SetB(Set)
4

3 に答える 3

12

おそらくあなたを混乱させているのは構文です。これを次のように書き換えることができます。

type Set = (Int => Boolean)

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

だから、これは整理しやすいかもしれません。s を受け取って new を返すメソッドunionを定義しています。私たちの実装では、 は関数 from toの別の名前です(つまり、引数が「セット内」にあるかどうかを示す関数)。SetSetSetIntBoolean

メソッドの本体はunion、無名関数 from Intto Boolean(Set定義した a です) を作成します。この無名関数は、パラメーターiIntを受け入れ、set ( ) 内にある場合、またはset ( )内にあるtrue場合にのみ、戻り値を返します。iaa(i)ibb(i)

于 2012-10-02T14:11:37.367 に答える
1

いいえ、セットにはforループが設定されていません。

の戻り型union(a: Set, b: Set): Setは関数です。;を呼び出すと、宣言のコードはa(i) || b(i)実行されません。unionの結果を呼び出したときにのみ実行されますunion

そしてi、それは整数であるセットではありません。これは、によって返される関数の単一の引数ですunion

ここで何が起こるかというと、setandunion関数を使用して、それらを論理和演算子()と組み合わせて関数の二分木を構築します||。このset関数を使用すると、リーフを作成しunion、それらを組み合わせてより大きな関数ツリーにすることができます。

例:

def set_one = set(1)
def set_two = set(2)
def set_three = set(2)
def set_one_or_two = union(set_one, set_two)
def set_one_two_three = union(set_three, set_one_or_two)

set_one_two_three、2つのノードを含む関数ツリーになります。左側は、渡されたパラメーターが3に等しいかどうかをチェックする関数です。右側は、2つの関数自体を含むノードであり、パラメーターがそれぞれ1と2に等しいかどうかをチェックします。

于 2012-10-02T14:20:57.047 に答える
1

注意深く見ると、その質問はtype Set = Int => Boolean. scala.collection.Setしたがって、ここでは話していません。私たちは話しているInt => Boolean

関数リテラルを記述するには、=>キーワードを使用します。

x => someOp(x)

型が既知の場合は、型に注釈を付ける必要はありません。したがって、 rhs が であることがわかっている場合、それが typeであることがInt => Booleanわかります。xInt

于 2012-10-02T14:11:59.823 に答える