我發現自己想要寫這篇文章:你如何讓一個班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抽象方法來覆蓋。
什麼是地道的,Scalastic的方式來做到這一點?
我認爲向'PairOfSeqs'添加一個'flatMap'方法是行不通的,因爲Seq.flatMap'實際上得到了調用。 'Seq.flatMap'可以正確合併(「拼合」)'List','Option's,'Set's和其他東西。我想知道如何使它正確地合併「PairsOfSeqs」。我是否誤解了有關'flatMap'的一些基礎知識? (我仍在消化'SeqPairCanMap' ...) – 2014-10-06 17:57:32
@BenKovitz - 'flatMap'實際上調用了從隱式CanBuildFrom中獲取的構建器。但是我想你要問的是,當你使用'flatMap'時,你是否可以從'Seq'到'PairOfSeqs'進行_implicit_轉換。在那裏,答案是否定的。 – 2014-10-06 18:02:43
好的,現在我想我看到了我的困惑,這很好的解釋了答案頂部的類型簽名。我忘記了Seq.flatMap返回一個Seq,Set.flatMap返回一個Set,等等,不一定具有相同的類型參數。我在想'flatMap(f)'會返回一個與'f'返回的類型相同的值(我猜這是正常使用的)。謝謝! – 2014-10-06 18:05:42