以下
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
)
答案 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}}