2016-07-22 32 views
2

folgende Code funktioniert: entlang der Linien von strEq, etwas zu schaffen, direkt Standard Operator zu verwenden, anstattKann der Standard-Operator geupdated oder curried sein?

val ls = Seq("a", "b", "b", "c") 

def strEq(a: String, b: String) = a == b 
val detectChange = (ls zip ls.tail).map((strEq _). tupled) 

Ist es möglich?

scala> val ls = Seq("a", "b", "b", "c") 
ls: Seq[String] = List(a, b, b, c) 

scala> (ls, ls.tail).zipped.map(_ == _) 
res0: Seq[Boolean] = List(false, true, false) 

Weitere Varianten sind

scala> (ls zip ls.tail).map{case (a,b) => a == b} 
res2: Seq[Boolean] = List(false, true, false) 

scala> (ls zip ls.tail).map{((_: String) == (_: String)).tupled} 
res5: Seq[Boolean] = List(false, true, false) 

scala> (ls zip ls.tail).map(((_ == _): ((String, String) => Boolean)).tupled) 
res0: Seq[Boolean] = List(false, true, false) 

aber sie sind nicht leichter zu verstehen, oder einfacher zu schreiben:

val detectChange = (ls zip ls.tail).map(== _. tupled) 
+0

Ihr Code kompiliert nicht auf scala 2.11.8: ' ') 'erwartet aber'. ' gefunden. [Fehler] val detectChange = (ls zip ls.tail) .map (strEq _. Tupled) '. –

+1

Sie müssen das '.' nach' strEq' entfernen, damit dies kompiliert werden kann. –

+0

Die nächste Sache, die ich sehe (die ein bisschen mehr worse), die eingebaut ist, ist '(ls zip ls.tail) .map {fall (x, y) => x == y}' –

Antwort

4

Für den speziellen Fall eines 2-Tupel, können Sie verwenden. Die Inferenzmaschine von Scolas ist im letzten Fall nicht stark genug, um auf den richtigen Typ zu schließen. Wenn die Parametertypen nicht übereinstimmen, müssen Sie daher oft auf die Verwendung von Mustervergleich zurückgreifen.

+0

Ich glaube '((_: String) == (_: String)). Tupled' beantwortet meine Titelfrage" Wie tuple ich einen Standardoperator "- es zeigt, wie man die Funktion erhält, die dem Operator entspricht. Es ist ausführlicher als ich mir erhofft habe, aber es zeigt, dass es möglich ist. – Suma

1

das Problem, das ich denke, dass Sie in ist, dass == ist kein Standard-Operator im traditionellen Sinne, es ist eine Methode. Es existiert nicht als Function2, also gibt es keinen Platz, um es mit .tupled zu nennen, das ergeben würde, was Sie suchen. ((_: String) == (_: String)).tupled funktioniert, weil es ist ein Function2.

nicht sicher, ob das Problem, das oben ein Beispiel oder etwas, das Sie wirklich tun müssen, aber zum Spaß, das funktioniert auch:

ls sliding 2 map (_.toSet.size == 1)