【问题标题】:Options in scalascala中的选项
【发布时间】:2018-05-04 23:07:22
【问题描述】:

我正在尝试编写一个函数,该函数将位置列表和一个函数(它获取位置并生成可选路径)作为参数。

所以我需要找到 f 的结果不是 None 的第一个位置,如果有的话。我们真的不需要知道关于函数的任何信息,除了它的类型。但是,我们需要计算 f(x) 的结果是什么(只计算一次)

所以基本上这就是我要写的方法:

【问题讨论】:

  • 我在 Scala 方面没有太多经验,我想知道如何使用 Option。图像中的第一行是否等同于 if (xs==Nil) None ?

标签: scala list function path options


【解决方案1】:

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

【讨论】:

  • 我会使用迭代器而不是视图。此外,在f 之后,您不应该需要(_)。其他... +1 以获得优雅且惯用的解决方案。
  • 你能解释一下你这样做是为了什么吗?这如何表示函数中的所有分支?
  • @Dima 对,迭代器也可以。我没有意识到它也提供了懒惰。
  • @JamesT xs.view.map(f(_)) 在函数 f 的帮助下将列表中的每个 Pos 映射到 Option[Path]。然后我们使用find 遍历转换后的列表,并返回第一个找到的定义了 Option 的元素。
  • 最后需要一个.flatten,因为这会返回一个Option[Option[Path]]
【解决方案2】:

如果你喜欢(尾)递归:

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

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2014-11-28
    • 2017-09-20
    相关资源
    最近更新 更多