【发布时间】:2017-10-27 15:16:39
【问题描述】:
我有一个函数字面量
{case QualifiedType(preds, ty) =>
t.ty = ty ;
Some((emptyEqualityConstraintSet,preds)) }
这会导致错误消息
missing parameter type for expanded function The argument types of an anonymous function
must be fully known. (SLS 8.5) Expected type was:
? => Option[(Typer.this.EqualityConstraintSet, Typer.this.TypeRelationSet)]
我查看了SLS 8.5,但没有找到解释。
如果我自己将函数扩展为
{(qt : QualifiedType) =>
qt match {case QualifiedType(preds, ty) =>
t.ty = ty ;
Some((emptyEqualityConstraintSet,preds)) }}
错误消失了。
(a) 为什么这是一个错误?
(b) 我能做些什么来解决它?
我尝试了明显的解决方法,即在模式和 => 之间添加 : QualifiedType,但这是一个语法错误。
我注意到的一件事是上下文有所不同。如果我使用函数文字作为声明为期望 QualifiedType => B 的函数的参数,则没有错误。但是,如果我将它用作期望 A => B 的函数的参数,则会出现错误。我希望这里发生的事情是,由于可以想象该模式可以应用于类型是 QualifiedType 的超类型的对象,编译器不愿意在不保证函数不会应用于的情况下分配明显的类型任何不是 QualifiedType 的东西。我真正想要的是能够写{QualifiedType( preds, ty) => ...}
并让它与 Haskell 的 \QualifiedType(preds,ty) -> ... 含义相同。
【问题讨论】:
-
接受的答案仅解决问题 (a)。我的回答中回答了问题 (b)。
标签: scala lambda pattern-matching function-literal