scala中的选项
我正在尝试编写一个函数,它以一个位置列表和一个函数(它以一个位置、生成和可选路径)作为参数 所以我需要找到第一个位置,其中f的结果不是无,如果有。除了函数的类型之外,我们不需要知道任何关于函数的信息。然而,我们需要计算f(x)的结果(仅一次) 因此,本质上这就是我试图编写的方法: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.
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,迭代器也可以工作。我没有意识到它也提供了惰性。@JamesTxs.view.map(f())
借助函数f
将列表中的每个Pos映射到选项[Path]。然后我们用find
迭代转换后的列表,返回第一个找到的元素,该元素定义了选项。最后需要一个.flatte
,因为这将返回一个选项[Option[Path]]
。