2017-11-21 19 views
0

위치 목록과 함수 (위치와 생성자 및 선택적 경로를 인수로 취함)를 인수로 취하는 함수를 작성하려고합니다.스칼라의 옵션

그래서 f의 결과가 None이 아닌 첫 번째 위치를 찾아야합니다. 우리는 그 타입을 제외하고는 함수에 대해 알 필요가 없습니다.

+0

나는 무엇이든지 스칼라에 많은 경험이없는 내가 옵션 이미지의 첫 번째 행의 경우 (XS == 무기 호) 없음 동등 used.Would되는 방법에 대해 궁금 해서요? –

답변

1

xs.view.map(f(_)).find(_.isDefined)

+0

필자는보기보다는 iterator를 사용할 것입니다. 또한,'f '뒤에'(_)'이 필요하지 않아야한다. 저것은 저것을 ... +1 우아하고, 관용구 해결책을 위해. – Dima

+0

이 작업을 통해 정확히 무엇을했는지 설명 할 수 있습니까? 이 함수는 함수의 모든 분기를 어떻게 대표합니까? –

+0

@Dima right, iterator도 작동합니다. 나는 그것이 게으름을 또한 제공한다는 것을 깨닫지 못했습니다. –

0

원하는 경우 (꼬리 : 그러나, 우리는

그래서 기본적으로이 내가 쓰기를 시도하고있는 방법이 될 것입니다 F (X)의 결과가 (한 번만)이 무엇인지 계산해야) 재귀 :

case class Pos(value: Int) 
case class Path(value: Int) 

@scala.annotation.tailrec 
def first(xs: List[Pos], f: Pos => Option[Path]) : Option[Path] = xs match { 
    case Nil => None 
    case p :: res => f(p) match { 
    case None => first(res, f) 
    case r => r 
    } 
} 

val list = List(Pos(1), Pos(2)) 
def f(p: Pos): Option[Path] = 
    if(p.value == 2) Option(Path(2)) else None 

println(first(list, f)) // prints "Some(Path(2))"