Ich kann scalaz
|>
Operator verwenden, wenn ich Funktion und Objekt wechseln möchte, damit es ein wenig mehr Lesbarkeit erworben werden kann. Lassen Sie mich Ihnen eine Modellfunktion vorstellen: Switch-Funktion und Objekt mit Scalaz '|>
def length2(x:String) = x.length * 2
Jetzt kann ich es auf beide Arten schreiben:
"aoeu" |> length2
length2("aoeu")
Aber wenn ich diese Funktion generischer definiere, hört es auf zu arbeiten.
def length2(x:SeqLike[_
,_
]) = x.length * 2
length2("aoeu") // ok
"aoeu" |> length2 // doesn't work
Warum der Compiler das nicht versteht? Es gibt definitiv eine implizite Umwandlung von
String
in eine Klasse, die in Merkmal
SeqLike
mischt.
Tricky. Zuerst dachte ich, es liegt daran, dass man nur einen implizit haben kann, aber jetzt scheint es vielleicht auch ein Varianzproblem irgendwo versteckt zu sein ... – Debilski
@Debilski, ich bin mir nicht sicher, wo '|> 'in scalaz definiert ist, aber wann Ich habe versucht, mein eigenes zu definieren, ich denke, die "einzige implizite Regel" ist es, die das Anwenden verhinderte: "aoeu" müsste implizit in die Klasse mit der '|>' Methode und dann wieder in 'SeqLike' konvertiert werden. – huynhjl
Zeigt die Fehlermeldung an. Nicht jeder hat Scalaz bereitwillig verfügbar, aber Fehlermeldungen erklären normalerweise, was schief läuft. –