Для понимания являются синтаксическим сахаром для монадического преобразования, и, как таковые, полезны во всех видах мест.При этом они гораздо более многословны в Scala, чем эквивалентная конструкция Haskell (конечно, Haskell не является строгим по умолчанию, поэтому нельзя говорить о производительности конструкции, как в Scala).
Такжеважно, что эта конструкция сохраняет ясность того, что делается, и позволяет избежать быстрого нарастания отступов или ненужных вложений частных методов.
Что касается окончательного рассмотрения, скрывает ли это сложность или нет, я буду утверждать следующее:
for {
b1 <- books
b2 <- books
if b1 != b2
a1 <- b1.authors
a2 <- b2.authors
if a1 == a2
} yield a1
Очень легко увидеть, что делается, и сложность очевидна: b ^ 2 * a ^ 2 (фильтр не изменит сложности), для количества книг и количества авторов,Теперь напишите тот же код на Java, либо с глубоким отступом, либо с закрытыми методами, и постарайтесь быстро выяснить, в чем состоит сложность кода.
Так что, имхо, это не такскрыть сложность, но, наоборот, прояснить это.
Что касается упомянутых вами определений map
/ flatMap
/ filter
, они не принадлежат List
или любому другому классупоэтому они не будут применяться.По сути,
for(x <- List(1, 2, 3)) yield x * 2
переводится в
List(1, 2, 3) map (x => x * 2)
, и это не то же самое, что
map(List(1, 2, 3), ((x: Int) => x * 2)))
, так как определение, которое вы передали, будет называться,Для записи, фактическая реализация map
в List
:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That = {
val b = bf(repr)
b.sizeHint(this)
for (x <- this) b += f(x)
b.result
}