【发布时间】:2015-07-21 18:44:35
【问题描述】:
我想调用一个通用函数f[X](...),在我的例子中X恰好是Option[Y]。我尝试将Some[...] 和None 都传递给函数需要X,但Scala 坚持X 的类型为Some[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 coding-style type-inference