Ответ 1
Есть ли способ вернуться в рамках предложения фильтра того же понимания к элементам, которые уже были получены?
Твой для понимания десугаров к чему-то более-менее нравится
pathSets flatMap {
pathSet => pathSet filter {
path => path.endState contains target
}
} map {path => path}
Последнее отображение с функцией идентификации - это ваш доход. Я не могу вспомнить, позволяет ли спецификация разрешить эту карту, когда она является функцией идентификации.
В любом случае, я надеюсь, что это станет более ясным, почему нет "возврата" к этой структуре.
Вы можете написать ленивую, рекурсивную функцию отличной функции
implicit class DistinctStream[T](s: Stream[T]) {
def distinctBy[V](f: T => V): Stream[T] = {
def distinctBy(remainder: Stream[T], seen:Set[V]): Stream[T] =
remainder match {
case head #:: tail =>
val value = f(head)
if (seen contains value) distinctBy(tail, seen)
else Stream.cons(head, distinctBy(tail, seen + value))
case empty => empty
}
distinctBy(s, Set())
}
}
И используйте его так
def solutions(target: Int): Stream[Path] =
(for {
pathSet <- pathSets
path <- pathSet
if path.endState contains target
} yield path) distinctBy (_.endState)
Да, теперь есть рекурсия. Но уже существовало то, что функции Stream map, flatMap и filter теперь все ленивые рекурсивные функции.