2017-07-10 3 views
-1
type Set = Int => Boolean 
def contains(s: Set, elem: Int): Boolean = s(elem) 
def union(s: Set, t: Set): Set = (x => contains(t,x) || contains(s,x)) 
def singletonSet(elem: Int): Set = (x => x==elem) 

...foldLeft Argument Unterschrift: o

val s1 = singletonSet(1) 
val s2 = singletonSet(2) 
val s3 = singletonSet(3) 

// works 
val s = List(s1,s2,s3).foldLeft(union(_,_)) 

// error 
val s = List(s1,s2,s3).foldLeft(union) 

Warum der zweite Weg nicht funktioniert? Es sagt, die Unterschrift meiner Gewerkschaft ist falsch!

Aber es funktioniert, wenn ich Wildcard-Argumente wie union(_, _) verwenden. Kann ich nicht einfach union wie im zweiten Beispiel verwenden?

+0

Welche Dummy-Argumente meinst du? wen meinst du mit "ihr"? –

+0

@katie versuchen, ein wenig Formalität in Ihren Fragen zu halten. Keine Notwendigkeit für Emoticons etc. macht nur die Frage schwieriger zu lesen. Versuchen Sie auch zu vermeiden, Themen zu vergessen (es ist nicht immer klar, was Sie mit ihm meinen). – thwiegan

Antwort

0

foldLeft ist wie folgt definiert:

def foldLeft[B](z: B)(op: (B, A) ⇒ B): B 

Das erste Argument die 'Null' ist, so dass das Element, das zuerst in die Falz Funktion übergeben wird (das zweite Argument). Im ersten Fall übergeben Sie also die Funktion union als Null-Argument (und einziges Argument). Es wird deutlich, wenn Sie Typ Anmerkungen hinzufügen:

val sU1: (((Set, Set) => Set, Set) => (Set, Set) => Set) => (Set, Set) => Set = List(s1,s2,s3).foldLeft(union(_,_)) 

Wenn Sie nur die Null-Argument zu foldLeft (Stichwort currying) geben Sie eine Funktion erhalten, eine Funktion als Parameter genommen wird. Die Parameterfunktion nimmt Elemente der Typen Ihrer Elemente in die Liste und das Nullargument (also eine Set und die Art der Vereinigung ->(Set, Set) => Set) und gibt etwas vom Typ Ihres Nullarguments zurück (also in Ihrem ersten Fall wieder eine Funktion von Typ (Set, Set) => Set).

Was möchten Sie wahrscheinlich ist:

val sU2: Set = List(s1,s2,s3).foldLeft(singletonSet(0))(union) 

Sie benötigen einen gültigen Null Argument übergeben und dann können Sie die Vereinigung Funktion verwenden, wie Sie wollen.

Eine weitere Option, wenn Sie einen Anfangswert liefern nicht wollen, ist reduceLeft, die in der Liste als Anfangswert das erste Element nimmt:

val sU3: Set = List(s1,s2,s3).reduceLeft(union) 

Ich denke, dass mehr Sinn in Ihrem Fall macht .

+0

vielen Dank ^^ –