Как я могу перебрать список списков в 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
Другие вопросы по тегам