2012-04-11 11 views
0

Ich habe den folgenden Code in Scala-IDE:Scala - Leiten einer Funktion - eine Art Chaos

type myF =() => Boolean 

def acceptFunction(f: myF) { 
    //... 
} 

und dann:

var a = false 

def isA =() => a 

aber wenn ich versuche, vorbei es, auf die acceptFunction, es führt zu Fehler:

acceptFunction(isA) 

der Fehler ist:

type mismatch; found :() => Boolean required: Boolean

Aber warum?

Wenn ich isA wie folgt erklären:

def isA() =() => a 

dann ist es akzeptiert, aber ich nehme an, es ist erhalten ausgewertet wegen der Klammer.

Gibt es eine Möglichkeit, eine solche Funktion für eine weitere Auswertung zu übergeben?

UPDATE:

Sieht aus wie es etwas mit Scala-IDE ist. Die REPL hat keine Probleme mit diesen Ausdrücken. Jedoch kann ich es immer noch nicht schaffen, dass die übergebene Funktion nicht zu einem Abschluss wird. Ich meine, dass es in Schließung, und Ändern der var a später und Aufruf des Beispiels mit println(f()) wieder - ändert sich nicht den Wert. Der zweite Teil der Frage bleibt also bestehen: Gibt es einen Weg, eine solche Funktion für eine weitere Bewertung zu übergeben?

+0

Ich aktualisierte meine Antwort mit mehr Fragen als Antwort auf Ihr Update. –

+0

Es funktioniert perfekt in Scala IDE. Ich habe deinen Code in ein 'Objekt' gehüllt. –

+0

Es schlägt mit dem Fehler fehl, den du erwähnst, wenn ich die leere Klammer an der Aufrufstelle hinzufüge, wie zum Beispiel 'acceptFunction (isA())' - was natürlich richtig ist, da du beim Anwenden der Funktion einen Booleschen Wert erhältst '. –

Antwort

1

Sind Sie sicher, dass Sie beim ersten Schreiben des Codes keinen Fehler gemacht haben? Ich habe kopiert und eingefügt, was Sie in die 2.9.1 REPL hatten und es hat gut funktioniert.

scala> type myF =() => Boolean 
defined type alias myF 

scala> var a = false 
a: Boolean = false 

scala> def isA =() => a 
isA:() => Boolean 

scala> def acceptFunction(f: myF) {println(f())} 
acceptFunction: (f:() => Boolean)Unit 

scala> acceptFunction(isA) 
false 

scala> 

UPDATE:isA ist ein Verschluss, wenn Sie es definieren. Die Übergabe an acceptFunction hat keinen Einfluss darauf, ob es sich um a handelt.

Ist es Ihre Aufgabe, eine Funktion zu schreiben, acceptFunction, die eine Funktion f übernimmt, die einen externen Wert, a, zum Zeitpunkt der Definition erfasst?

Man könnte das so wie tun:

// Defines a function which returns a function with returns the 
// value that was captured at the outer function's call time. 
def isB = { (b: Boolean) => {() => b }: myF } 

a = true 

val f = isB(a) 

acceptFunction(f) // >> true 

a = false 

acceptFunction(f) // >> true 

Ist das, wo Sie hin möchten?

+0

Das gleiche hier, ich schrieb die gleiche Antwort. –

+0

Dasselbe gilt für Scala Version 2.9.1-1 (Java HotSpot (TM) 64-Bit Server VM, Java 1.6.0_31). – Jan

+0

Hmmm, seltsam. Scheint so, als ob es etwas mit Scala-IDE ist. Dies ist nicht das erste Mal, dass es scheint, was nicht da ist. Ja, es hat auch für mich in der REPL funktioniert.Es erzeugt jedoch immer einen Abschluss, so dass das Ändern der Variablen später keinen Einfluss auf die übergebene Funktion hat. Siehe das Update der Frage. – noncom