У меня есть коллекция, которую я хочу сопоставить с новой коллекцией, однако каждое результирующее значение зависит от значения до нее каким-то образом. Я мог бы решить это с помощью a leftFoldScala, крест между foldLeft и картой, поддерживающей ленивую оценку
val result:List[B] = (myList:List[A]).foldLeft(C -> List.empty[B]){
case ((c, list), a) =>
..some function returning something like..
C -> (B :: list)
}
Проблема здесь. Мне нужно выполнить итерацию по всему списку, чтобы получить результирующий список. Скажем, мне нужна функция, которая отображает TraversableOnce [A] в TraversableOnce [B] и оценивает только членов, как я их называю? Мне кажется, что это довольно обычная проблема, поэтому мне интересно, существует ли общий подход к этому. То, что я в настоящее время является:
implicit class TraversableOnceEx[T](val self : TraversableOnce[T]) extends AnyVal {
def foldyMappyFunction[A, U](a:A)(func:(A,T) => (A,U)):TraversableOnce[U] = {
var currentA = a
self.map { t =>
val result = func(currentA, t)
currentA = result._1
result._2
}
}
}
Насколько функциональная чистота идет, вы не можете запустить его параллельно, но в остальном, кажется, звук.
Примером может быть; Верните мне каждый элемент, и если это первый элемент, который появился раньше.
val elements:TraversableOnce[E]
val result = elements.mappyFoldyFunction(Set.empty[E]) {
(s, e) => (s + e) -> (e -> s.contains(e))
}
result:TraversableOnce[(E,Boolean)]
Не могли бы вы добавить пример вызова вашей 'foldyMappingFunction'? – david
Я обновил пример –