Я нахожу, что хочу, чтобы написать это:Как сделать класс flatMappable?
def allAsAndFs(node: Node): PairOfSeqs[Action, Factor] =
node.regularNames.flatMap { name => regularAsAndFs(name) } ++
node.specialNames.flatMap { name => specialAsAndFs(name) }
где:
def regularNames: Seq[String]
def specialNames: Seq[String]
def regularAsAndFs(name: String): PairOfSeqs[Action, Factor]
def specialAsAndFs(name: String): PairOfSeqs[Action, Factor]
и:
class PairOfSeqs[A, B](as: Seq[A], bs: Seq[B]) {
def ++(that: PairOfSeqs[A, B]): PairOfSeqs[A, B] =
PairOfSeqs(as ++ that.as, bs ++ that.bs)
. . .
}
Что мне нужно сделать, чтобы flatMap
сливаться в PairsOfSeqs
по , вызывающий соответствующий метод ++
?
Похоже PairOfSeqs
должна распространяться GenTraversableOnce
, но GenTraversableOnce
имеет довольно удивительные 47 абстрактные методы для переопределения.
Что такое идиоматический, скалистический способ сделать это?
Я думал, что добавление метода 'flatMap' к' PairOfSeqs' не будет работать, потому что 'Seq.flatMap' фактически получает называется. 'Seq.flatMap' может совместить (« сгладить »)' List', 'Option',' Set' и другие вещи правильно. Я хочу знать, как заставить его правильно скомбинировать «PairsOfSeqs». Я что-то недопонимаю в отношении «flatMap»? (Я все еще перевариваю 'SeqPairCanMap' ...) –
@BenKovitz -' flatMap' на самом деле вызывает сборщиков, полученных из неявного 'CanBuildFrom'. Но я думаю, что вы спрашиваете, можете ли вы получить преобразование _implicit_ из 'Seq' в' PairOfSeqs', когда вы используете 'flatMap'. Там ответ - нет. –
ОК, теперь я думаю, что вижу свое замешательство, которое хорошо объясняется сигнатурами типа в верхней части вашего ответа. Я забыл, что 'Seq.flatMap' возвращает' Seq', 'Set.flatMap' возвращает' Set' и т. Д., Просто не обязательно с теми же параметрами типа.Я думал, что 'flatMap (f)' будет возвращать значение с тем же типом, который возвращает 'f' (что, как я полагаю, при обычном использовании). Благодаря! –