在这种情况下,为什么类型推断失败了Seq#collect

时间:2014-03-18 20:43:13

标签: scala

以下

List(1, 2, 3).collect { x =>
  val dummy = ()
  x match { case _ => x }
}

结果

<console>:9: error: missing parameter type
                  List(1, 2, 3).collect { x =>

但这个看似相同的片段按预期工作:

List(1, 2, 3).collect { x =>
  x match { case _ => x }
}

collect确实需要PartialFunction,但我看到这一点的方式是,如果{ x => x match { ... } }PartialFunction(这必须归因于编译器,因为它看起来就像throws MatchError)的正常函数,然后{ x => smth(); x match { ... } }也应该是PartialFunction。 (编辑:我不确定第一个案例是否被推断为PartialFunction

1 个答案:

答案 0 :(得分:2)

此行为在Scala规范的8.5 Pattern Matching Anonymous Functions部分中进行了描述。

简而言之,这意味着表达式{x => x match { case ... => ... } }(一个匿名函数)在预期PartialFunction时会隐式转换为PartialFunction,就像{collect一样。 1}}。

表达式

{ x =>
  val dummy = ()
  x match { case _ => x }
}

具有不同的形状,因此不会隐式转换。它被视为类型A => B,因为它采用类型A的值,并且其主体包含两个表达式,即val dummy = ()x match { case _ => x },其中后者生成类型{的值{1}}