Вещи перемещались в функциональное направление некоторое время. Два спокойных новых ребенка прошлых нескольких лет, Ruby и Python, оба радикально ближе к функциональным языкам, чем, что прибыло перед ними — так так, чтобы некоторые Lispers начали поддерживать один или другой как "достаточно близко".
И с аппаратными средствами с массовым параллелизмом, оказывающими эволюционное давление на всех — и функциональные языки в лучшем месте для контакта с изменениями —, это не столь далекий прыжок, как это однажды должно было думать, что Haskell или F# будут следующей большой вещью.
причина довольно проста (я думаю) и связана с тем фактом, что (на черте Map
):
m += (a -> b)
является сокращением для:
m = m.+(t2) //where t2 is of type Tuple2[A,B]
Очевидно, что если вы используете запятую в первом примере, Scala интерпретирует это как вызов метода:
m = m.+(a, b)
Этого метода не существует в характеристике Map
. Правила вызова метода означают, что сначала вычисляется a -> b
(до Tuple2
) и, следовательно, вызывается правильный метод. Примечание: Использование дополнительной пары круглых скобок отлично работает:
m += ( (a,b) ) //works just fine but less readable
Oxbow прав. Однако вы можете использовать другую скобку для устранения неоднозначности:
m += (((0,2), "b"))