4

如果列表不为空,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
  }
}

示例用法:mylist.convertOrElse("prefix" + _.mkString(", "), "")

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

如您所见,我已经编写了自己的隐式,但是当适当的 scalaz 导入可以解决问题时,我讨厌添加自己的隐式。

4

2 回答 2

6

您应该能够NonEmptyList像这样使用 Scalaz 的功能:

import scalaz._
import Scalaz._        
val list = List()    
val str = list.toNel.map(_.list.mkString(",")).getOrElse("empty")
println(str)

在我的示例中,您会看到“空”一词被打印出来。如果您将列表定义更改为:

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

然后你会看到 "foo,bar" 被打印出来。

于 2013-09-01T00:19:17.357 回答
2

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

  • Option(list).filterNot(_.isEmpty).map(f)
  • list match { case x@(_ :: _) => Some(f(x)); case _ => None }
于 2013-09-01T08:46:43.533 回答