Вы можете сделать:
opt foldLeft (els) ((x, y) => fun(x))
или
(els /: opt) ((x,y) => fun(x))
(Оба решения будут оценивать els
по значению, которое может быть не тем, что вы хотите. Спасибо Рекс Керр за указание на него.)
Edit:
Но что вам действительно нужно, так это катаморфизм Скалаза cata
(в основном fold
, который не только обрабатывает значение Some
, но и отображает часть None
, что вы и описали)
opt.cata(fun, els)
определяется как (где value
- это значение параметра pimped)
def cata[X](some: A => X, none: => X): X = value match {
case None => none
case Some(a) => some(a)
}
, что эквивалентно opt.map(some).getOrElse(none)
.
Хотя я должен отметить, что вы должны использовать cata только тогда, когда это «более естественный» способ выразить это. Есть много случаев, когда достаточно простого map
- getOrElse
, особенно когда оно включает в себя потенциально много map
с. (Хотя вы, конечно, можете также связать fun
с композицией функций - это зависит от того, хотите ли вы сосредоточиться на композиции функций или преобразовании значений.)