scala中的选项

scala中的选项,scala,list,function,path,options,Scala,List,Function,Path,Options,我正在尝试编写一个函数,它以一个位置列表和一个函数(它以一个位置、生成和可选路径)作为参数 所以我需要找到第一个位置,其中f的结果不是无,如果有。除了函数的类型之外,我们不需要知道任何关于函数的信息。然而,我们需要计算f(x)的结果(仅一次) 因此,本质上这就是我试图编写的方法:xs.view.map(f()).find(u.isDefined)如果您喜欢(尾部)递归: case class Pos(value: Int) case class Path(value: Int) @scala.

我正在尝试编写一个函数,它以一个位置列表和一个函数(它以一个位置、生成和可选路径)作为参数

所以我需要找到第一个位置,其中f的结果不是无,如果有。除了函数的类型之外,我们不需要知道任何关于函数的信息。然而,我们需要计算f(x)的结果(仅一次)

因此,本质上这就是我试图编写的方法:

xs.view.map(f()).find(u.isDefined)
如果您喜欢(尾部)递归:

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))"

我在Scala方面没有太多经验,我想知道如何使用选项。图像中的第一行是否等同于if(xs==Nil)None?我会使用迭代器而不是视图。另外,您不应该在
f
之后使用
()
。其他的是+这是一个优雅的、惯用的解决方案。你能准确地解释一下你做了什么吗?这如何表示函数中的所有分支?@Dima right,迭代器也可以工作。我没有意识到它也提供了惰性。@JamesT
xs.view.map(f())
借助函数
f
将列表中的每个Pos映射到选项[Path]。然后我们用
find
迭代转换后的列表,返回第一个找到的元素,该元素定义了选项。最后需要一个
.flatte
,因为这将返回一个
选项[Option[Path]]