scala - 我可以让 Scala 在这里推断 Option 类型吗?

标签 scala coding-style type-inference

我想调用一个通用函数 f[X](...),在我的例子中 X 恰好是 Option[Y]。我尝试在函数需要 X 的地方传递 Some[...]None,但 Scala 坚持 XSome[Y] 类型。

  def flattenOptionMap[A, B](input : Map[A, Option[B]]) : Option[Map[A, B]] = {
    input.foldLeft[Option[Map[A,B]]] (Some(Map.empty)) {
      case (_, (_, None)) => None
      case (None, (_, _)) => None
      case (Some(acc), (key, Some(value))) => Some(acc + (key -> value))
    }
  }

在这个例子中,我必须明确指定 Option[Map[A,B]] 应该用作 foldLeft 的通用类型。所有必要的类型信息都已包含在上下文中,并且在我看来,过于频繁地键入诸如 Option[Map[A,B]] 之类的繁琐类型会大大降低代码的可读性。

有没有办法让 Scala 推断类型,或者避免复制粘贴整个类型?

最佳答案

当您使用 Option(Map.empty[A, B]) 作为您的 foldLeft 的起始值时,Scala 将推断出正确的类型,正如我在评论(以及他的回答中的 beefyhalo)。

我想补充一点,如果您愿意使用 Scalaz,您可以只使用 sequence 函数。

import scalaz._
import Scalaz._ 

val mapSome = Map(1 -> Some("a"), 2 -> Some("b"))
val mapNone = Map(1 -> Some("a"), 2 -> Some("b"), 3 -> None)

mapSome.sequence
flattenOptionMap(mapSome)
// Option[Map[Int,String]] = Some(Map(1 -> a, 2 -> b))

mapNone.sequence
flattenOptionMap(mapNone)
// Option[Map[Int,String]] = None

关于scala - 我可以让 Scala 在这里推断 Option 类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31547174/

相关文章:

scala - 为什么我的Scala future 无法传播错误?

scala - 在提升的 Slick 中使用案例类

从可迭代对象创建集合时,Scala 是否必须转换为 Seq?

php - 如何从我的 ajax php 函数中获取 html 和 javascript?

swift - 对成员 && 的不明确引用

javascript - 在 TypeScript 文件中的光标下输入

java - 使用本地类型推断的交叉类型的有用应用

java - scala InputStreamReader 不读取整个数据(文件)

java - 具有 Setter 或 Boolean Getter 的变量

Java代码格式化