У меня есть литерал функции
{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
между шаблоном и = > , но это синтаксическая ошибка.
Одна вещь, которую я заметил, это то, что контекст имеет значение. Если я использую функцию literal в качестве аргумента функции, объявленной как ожидающую QualifiedType => B
, ошибки нет. Но если я использую его как аргумент функции, ожидающей A => B
, возникает ошибка. Я ожидаю, что здесь происходит то, что, поскольку шаблон может быть предположительно применен к объекту, тип которого является супертипом QualifiedType, компилятор не желает назначать очевидный тип без уверенности, что функция не будет применяться к все, что не является QualifiedType. На самом деле я хотел бы написать {QualifiedType( preds, ty) => ...}
и имеет в виду то же самое, что и Haskell \QualifiedType(preds,ty) -> ...
.