Как я могу перебрать список списков в Scala?
Я пытаюсь реализовать свой собственный универсальный метод для списочных объектов, которые содержат списки в Scala. На данный момент у меня есть
def myFlatten[T](list: List[List[t]]): List[T] = {
for (xs <- list)
for (x <- xs) yield x
}
Я получаю сообщение:
для хз найден блок требуемого списка.
3 ответа
def myFlatten[T](list : List[List[T]]) = for(xs <- list; x <- xs) yield x
Очень близко! Вот тот, который работает:
scala> def myFlatten[T](list: List[List[T]]): List[T] = for (xs <- list; x <- xs) yield x
myFlatten: [T](list: List[List[T]])List[T]
Или используйте встроенный flatten
scala> List(List(1, 2), List(3)).flatten
res0: List[Int] = List(1, 2, 3)
scala> List(Set(1, 2), Set(3)).flatten
res1: List[Int] = List(1, 2, 3)
Поучительно посмотреть, как написать эту функцию без for
синтаксический сахар.
scala> def myFlatten[T](list: List[List[T]]): List[T] = list flatMap identity
myFlatten: [T](list: List[List[T]])List[T]
scala> myFlatten(List(List(1, 2), List(3)))
res3: List[Int] = List(1, 2, 3)
ОБНОВИТЬ
Кстати, тот факт, что List[List[T]]
можно сплющить до List[T]
50% от причины, по которой List
это монада Как правило, это известно как join
, Остальные 50% связаны с тем, что вы можете отобразить функцию A => B
через List[A]
привести к List[B]
, Общее название для этого Functor map
, fmap и присоединяйтесь к Википедии.
Другой способ определения монады для конструктора типов M
с pure
операция, которая принимает значение типа A
и возвращает M[A]
; и bind
операция, которая занимает M[A]
, функция A => M[B]
и приводит к M[B]
, Для списков, pure
== List(_)
, а также bind
знак равно (l: List[A], f: (A => List[B])) => l.flatMap(f)
Лично мне нравится этот стиль:
def myFlatten[T](list: List[List[t]]): List[T] = for {
xs <- list
x <- xs
} yield x