gpt4 book ai didi

scala - 删除给定列表的给定数量的正项

转载 作者:行者123 更新时间:2023-12-04 12:39:58 25 4
gpt4 key购买 nike

假设我需要一个函数 List[Int] => Option[List[Int]]准确下降 n给定列表的元素 当且仅当 所有元素 > 0 .如果列表大小 <= n该函数应返回 None .

例如:

def posn(n: Int): List[Int] => Option[List[Int]] = ???
val pos4: List[Int] => Option[List[Int]] = posn(4)

scala> pos4(Nil)
res18: Option[List[Int]] = None

scala> pos4(List(-1))
res19: Option[List[Int]] = None

scala> pos4(List(-1, 2, 3))
res20: Option[List[Int]] = None

scala> pos4(List(1, 2, 3))
res21: Option[List[Int]] = None

scala> pos4(List(1, 2, 3, 4, 5))
res22: Option[List[Int]] = Some(List(5))

scala> pos4(List(1, 2, 3, -4, 5))
res23: Option[List[Int]] = None

我正在写 posn像那样:

def posn(n: Int): List[Int] => Option[List[Int]] = xs => 
if (xs.size >= n && xs.take(n).forall(_ > 0)) Some(xs.drop(n)) else None

这个功能似乎有点工作,但似乎并不优雅和惯用。你会如何重写它?

最佳答案

这是一个(可以说)更惯用的实现,它使用模式匹配和对 posn 的递归调用 - 但我不确定它比您建议的实现更可取:

def posn(n: Int): List[Int] => Option[List[Int]] = xs => (n, xs) match {
case (0, _) => Some(xs) // stop if enough objects dropped
case (_, head :: tail) if head > 0 => posn(n - 1)(tail) // drop positive and move on
case _ => None // found a negative item or end of xs => "fail"
}

关于scala - 删除给定列表的给定数量的正项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com