2017-11-21 10 views
0

私は、位置のリストと関数(位置と生成とオプションのパスを引数とする)を引数として取る関数を記述しようとしています。スカラーのオプション

だから、fの結果がNoneでない最初の位置を見つける必要があります。関数については、型を除いて何も知る必要はありません。

+0

私は全くScalaで多くの経験を持っていないと私はオプションは、画像の最初の行があれば(XS ==無記号)なしに相当するused.Wouldされる方法を不思議でしたか? –

答えて

1

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

+0

私はビューではなくイテレータを使用します。また、 '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))"