Обобщение метода сбора - PullRequest
4 голосов
/ 06 марта 2011

Если я хочу обобщить следующий метод для всех типов коллекций, которые поддерживают все необходимые операции (foldLeft, flatMap, map и :+), то как мне это сделать? В настоящее время он работает только со списками.

Код:

def join[A](lists: List[List[A]]): List[List[A]] = {
  lists.foldLeft(List(List[A]())) { case (acc, cur) =>
    for {
      a <- acc
      c <- cur
    } yield a :+ c
  }
}

1 Ответ

2 голосов
/ 06 марта 2011

Если вы хотите это только для коллекций, которые поддерживают :+, самый простой способ - просто определить его в терминах Seq вместо List.

Вы можете сделать его гораздо более универсальным, вплоть до Traversable, с помощью сборщиков. Я был бы счастлив объяснить это, когда у меня будет немного больше времени, но на этом уровне это будет сложно.

Аппликативные функторы Скалаза - это, вероятно, верный путь, но я позволю кому-то с большим опытом Скалаза, чем я, разобраться с этим конкретным ответом.

...