如果列表不是空的,scala或scalaz中是否有将函数应用于列表的函数?

如果列表不是空的,scala或scalaz中是否有将函数应用于列表的函数?,scala,scalaz,Scala,Scalaz,scala或scalaz中是否有一个函数,如果列表不是空的,则将函数应用于列表。否则它将返回一些默认值。该函数必须应用于列表本身,而不是列表的元素。也就是说,它实现了以下功能: implicit class RichList[A, M[A] <: Iterable[A]](list: M[A]) { def convertOrElse[B](fn: M[A] => B, whenEmpty: B) = { if (!list.isEmpty) fn(list) else

scala或scalaz中是否有一个函数,如果列表不是空的,则将函数应用于列表。否则它将返回一些默认值。该函数必须应用于列表本身,而不是列表的元素。也就是说,它实现了以下功能:

implicit class RichList[A, M[A] <: Iterable[A]](list: M[A]) {
  def convertOrElse[B](fn: M[A] => B, whenEmpty: B) = {
    if (!list.isEmpty) fn(list) else whenEmpty
  }
}
隐式类RichList[A,M[A]B,whenEmpty:B)={
如果(!list.isEmpty)fn(list)else何时
}
}
用法示例: mylist.convertOrElse(“前缀”+ux.mkString(“,”)”)

我记得在某个地方看到过这篇文章,但可能是在一篇博客或类似的文章中看到的。我现在似乎在scalaz中找不到它,但我甚至无法在网上找到最近的scalaz文档(这是另一个问题:)


正如您所看到的,我已经编写了我自己的隐式,但我讨厌在适当的scalaz导入可以实现这一目的时添加我自己的隐式。

您应该能够使用scalaz提供的
NonEmptyList
功能,如下所示:

import scalaz._
import Scalaz._        
val list = List()    
val str = list.toNel.map(_.list.mkString(",")).getOrElse("empty")
println(str)
在我的示例中,您会看到“empty”一词被打印出来。如果您将列表定义更改为:

val list = List("foo", "bar")

然后您会看到“foo,bar”被打印出来。

不使用Scalaz,您还可以执行以下操作之一:

implicit class RichList[A, M[A] <: Iterable[A]](list: M[A]) {
  def convertOrElse[B](fn: M[A] => B, whenEmpty: B) = {
    if (!list.isEmpty) fn(list) else whenEmpty
  }
}
  • 选项(列表).filterNot(u.isEmpty).map(f)
  • 列表匹配{
    案例x@(::)=>一些(f(x));
    案例=>无
    }