У меня есть некоторые проблемы с выводом типа Scala. В следующем примере рабочего листа я определил карту, которая сопоставляет любые значения функции, возвращающей значение Единицы.Непонятный вывод типа в scala
Интересно, что когда я пытаюсь определить одну и ту же карту, используя только одну строку кода, она не работает, потому что функции «bar» return-type внезапно меняются на Any вместо Unit.
type UnitFun = (Any) => Unit
val foo = "foo"
val bar = (a: Any) => System.out.println("bar")
val map: Map[Any, UnitFun] = Map().withDefaultValue(((a: Any) => Unit))
val doesCompile: Map[Any, UnitFun] = map + (foo -> bar)
val doesNotCompile: Map[Any, UnitFun] = Map().withDefaultValue(((a: Any) => Unit)) + (foo -> bar)
Я использую IDEA14 в IDE с Scala 2.11.6
Мне кажется, как это особенность/ошибка компилятора Scala, или я что-то отсутствует?
Кстати, я только что заметил, что когда я использую «бар» в качестве значения по умолчанию в «» doesNotCompile так:
val doesCompileNow: Map[Any, UnitFun] = Map().withDefaultValue(bar) + (foo -> bar)
вдруг, кажется, работает, я очень озадачены прямо сейчас. : D
Edit 1: @Mikolak
В этом случае, как же следующий код работает? :)
val a: Any => Unit = (a: Any) => Unit
val b: Any => Unit = (a: Any) =>()
Не должны ли оба выражения быть другого типа? Или существует какое-то неявное преобразование типов?
Добавлено объяснение относительно вашего редактирования. Обратите внимание, что это явление, полностью ортогональное исходному. –
Уже видел это, я думаю, что неявное преобразование из ** Unit.type ** в ** Any ** (в соответствии с intellij output) является тем, что привело меня к следующему этапу. Я предполагаю, что это просто очередное некое обращение. :) – pmkrefeld
Одна вещь для добавления: ** не верю ** Проверка синтаксиса IntelliJ. При медленном улучшении он все еще имеет склонность выводить как ложные срабатывания, так и ложные негативы. Другими словами, ваш первый курс действий при появлении странной ошибки должен заключаться в запуске 'sbt compile'. –