【问题标题】:Scala: type parameter for a collectionScala:集合的类型参数
【发布时间】:2016-09-13 02:30:51
【问题描述】:

我有一个函数可以将包含空序列的选项转换为无:

def emptyToNone[A](seqOpt: Option[Seq[A]]): Option[Seq[A]] = seqOpt match {
  case Some(Seq()) => None
  case _ => seqOpt
}

我想通过将 Seq 替换为类型参数来使其更通用,因此它可以与其他 Scala 集合一起使用。

我可以这样做:

def emptyToNone[C[A] <: Traversable[A], A](seqOpt: Option[C[A]]): Option[C[A]] = seqOpt match {
  case Some(s) if s.isEmpty => None
  case _ => seqOpt
}

但我必须使用 2 个类型参数,C 和 A。我可以在这里简化函数签名吗?

【问题讨论】:

    标签: scala higher-kinded-types


    【解决方案1】:

    编辑:修改为包含@Alexey 的建议。

    这可能是一种解决方案:

    def emptyToNone[C <: Traversable[_]](seqOpt: Option[C]): Option[C] =
    seqOpt.filter(_.nonEmpty)
    

    【讨论】:

    • 或简化:seqOpt.filter(_.nonEmpty).
    • @AlexeyRomanov 我猜seqOpt.map( s =&gt; if(s.nonEmpty) s else None) 是他正在寻找的,不是删除空的,而是用 None 代替。
    • @kali 这不会进行类型检查(或者更确切地说,它返回Option[AnyRef])。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多