Обычная работа с коллекциями Scala

Я написал функцию для поиска самой длинной общей подпоследовательности (LCS). Например, для двух последовательностей символов BANANA и ATANA он возвращает AANA. Реализация является наивной неэффективной адаптацией рекурсивного алгоритма, но она не имеет отношения к цели этого вопроса.

def LCS[T](a: Seq[T], b: Seq[T]): Seq[T] = {
    if (a.isEmpty || b.isEmpty)
      Seq.empty
    else if (a.head == b.head)
      a.head +: LCS(a.tail, b.tail)
    else {
      val case1 = LCS(a.tail, b)
      val case2 = LCS(a, b.tail)
      if (case1.length > case2.length) case1 else case2
    }
}

Я хочу реорганизовать эту функцию наиболее общим возможным способом . Текущая реализация работает для любых типов входных последовательностей, но всегда возвращает коллекцию типа List [T]. Я хочу добиться следующего поведения:

LCS(List('B','A','N','A','N','A'), List('A','T','A','N','A')) -> List('A','A','N','A')
LCS(Vector('B','A','N','A','N','A'), Vector('A','T','A','N','A')) -> Vector('A','A','N','A')

...and so on for all other Seqs...

Было бы замечательно, если бы LCS также мог обрабатывать String s и Array s:

LCS("BANANA", "ATANA") -> "AANA"
LCS(Array('B','A','N','A','N','A'), Array('A','T','A','N','A')) -> Array('A','A','N','A')

Я считаю, что с помощью библиотеки общих коллекций Scala 2.8 можно достичь хотя бы первого требование. Будем рады увидеть «тяжелую» технику, такую ​​как полиморфизм высшего порядка, классы типов, CanBuildFrom и т. Д.

Спасибо!

7
задан Nikolay Artamonov 20 April 2011 в 17:07
поделиться