Я не уверен, что согласен с Ландеи насчет flatMap
и map
.Если вы замените это на выдачу исключения, как это, большинство операций должно работать.
def apply(): Builder[ST,FieldSequence[FT,ST]] = sys.error("unsupported")
Из того, что я вижу в TraversableLike
, map
и flatMap
, а в большинстве других используется *Версия 1009 *.Так что для понимания вроде бы работа.Также кажется, что он должен следовать законам Монады (поле просто перенесено через).
Учитывая код, который вы имеете, вы можете сделать это:
scala> val fs = FieldSequence.fromSeq("str")(Vector(1,2))
fs: FieldSequence[java.lang.String,Int] = FieldSequence(1, 2)
scala> fs.map(1 + _)
res3: FieldSequence[java.lang.String,Int] = FieldSequence(2, 3)
scala> val fs2 = FieldSequence.fromSeq("str1")(Vector(10,20))
fs2: FieldSequence[java.lang.String,Int] = FieldSequence(10, 20)
scala> for (x <- fs if x > 0; y <- fs2) yield (x + y)
res5: FieldSequence[java.lang.String,Int] = FieldSequence(11, 21, 12, 22)
Что не работаетявляется следующим:
scala> fs.map(_ + "!")
// does not return a FieldSequence
scala> List(1,2).map(1 + _)(collection.breakOut): FieldSequence[String, Int]
java.lang.RuntimeException: unsupported
// this is where the apply() is used
Чтобы breakOut
работал, вам необходимо реализовать метод apply ().Я подозреваю, что вы можете сгенерировать компоновщик с некоторым значением по умолчанию для field
: def apply() = newBuilder[FT, ST](getDefault)
с некоторой реализацией getDefault, которая имеет смысл для вашего варианта использования.
Поскольку тот факт, что fs.map(_ + "!")
не сохраняет тип, вам нужно изменить свою подпись и реализацию, чтобы компилятор мог найти CanBuildFrom[FieldSequence[String, Int], String, FieldSequence[String, String]]
implicit def canBuildFrom[FT,ST_FROM,ST]:
CanBuildFrom[FieldSequence[FT,ST_FROM], ST, FieldSequence[FT,ST]] =
new CanBuildFrom[FieldSequence[FT,ST_FROM], ST, FieldSequence[FT,ST]] {
def apply(): Builder[ST,FieldSequence[FT,ST]]
= sys.error("unsupported")
def apply(from: FieldSequence[FT,ST_FROM]): Builder[ST,FieldSequence[FT,ST]]
= newBuilder[FT, ST](from.field)
}