После экспериментов с расширением eta в scala я обнаружил странную особенность.Давайте определим метод:
scala> def sum(a: Int, b: Int): Int = a + b
sum: (a: Int, b: Int)Int
Хорошо, до сих пор все в порядке.Теперь давайте присвоим его значению val, используя расширение eta:
scala> val f = sum _
f: (Int, Int) => Int = $$Lambda$1051/694580932@55638165
Теперь странная вещь приближается.Я могу снова применить eta-расширение к f, и оно работает (однако оно добавляет карри к моему методу):
scala> val g = f _
g: () => (Int, Int) => Int = $$Lambda$1055/1351568309@5602e540
Почему это работает?Я думал, что расширение eta было допустимо только для методов.Более того, я заметил, что это невозможно:
scala> ((a: Int, b: Int) => a + b: Int) _
<console>:12: error: _ must follow method; cannot follow (Int, Int) => Int
((a: Int, b: Int) => a + b: Int) _
^
Но разве это не то же самое, что применять расширение eta к f?Я немного сбит с толку, и эти eta-расширения все еще скрывают для меня магию.Большое спасибо!