2 Stimmen

Kompilierungsprobleme bei der Verwendung von Scalaz's MA-Methoden auf Set, aber nicht auf List

Das folgende funktioniert einwandfrei mit scala Beta1 und scalaz snapshot 5.0:

val p1: Int => Boolean = (i : Int) => i > 4

val s: List[Int] = List(1, 2, 3)
val b1 = s  p1

Aber das funktioniert nicht:

val s: Set[Int] = Set(1, 2, 3)
val b1 = s  p1

Ich bekomme den folgenden Fehler:

Gefunden: Int => Boolean
Erforderlich: Boolean => Boolean

Die Signatur der -Methode ist:

def (p: A => Boolean)(implicit r: FoldRight[M]): Boolean = any(p)

Und es sollte ein impliziter SetFoldRight im Scope sein. Es ist genau dasselbe für die Methoden: , und : - was ist hier los?

3voto

Ben Lings Punkte 28080

Es sieht so aus, als ob das A in MA[M[_],A] ein Boolean für ein Set ist. In dem Scalaz Objekt gibt es folgendes implizites:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R] = ma[PartialApply1Of2[Function1, A]#Apply, R](f)

Jetzt verstehe ich nicht ganz, was mit den Typen hier geschieht, aber es sieht so aus, als ob das A in MA[M[_],A] der Rückgabetyp des Function1 ist. Set[A] erweitert A => Boolean, daher wird das A in der Definition von zu Boolean inferiert.

Ein Fix ist die explizite Verwendung der ma Methode, um das Set in ein MA umzuwandeln, anstatt die Impliziten die Arbeit erledigen zu lassen:

val s = ma(Set(1, 2, 3))

3voto

retronym Punkte 54220

Ich muss dies zu object Scalaz hinzufügen:

implicit def SetMA[M[_] <: Set[_], A](s: M[A]): MA[M, A] = ma[M, A](s)

Aber dank #2741 stoße ich auf ein Problem, dieses höher zu priorisieren als die problematische Konvertierung:

implicit def Function1ApplyMA[A, R](f: A => R): MA[PartialApply1Of2[Function1, A]#Apply, R]  = ma[PartialApply1Of2[Function1, A]#Apply, R](f)

Ich wünschte wirklich, dass Seq und Set eher implizit in Function1 konvertierbar wären, anstatt davon zu erben.

UPDATE

Dies ist jetzt behoben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X