2013-07-22 3 views
3

Синтаксис для спичечных выражений довольно хороший:Мотивация для выражения матч синтаксиса

expr match { 
    case Test(l1) => ... 
    ... 
} 

Но это сводит меня с ума, что я не понимаю мотивацию к тому, почему этот этот синтаксис используется вместо match (expr) ..., как разветвление заявления в приличном потомке C!

Я не вижу разумного объяснения этому. И я не нахожу ответа ни на Программе в Scala, ни на сайте Scala, in this paper, this thesis, и здесь, и на других сайтах.

Это не то, что с ним что-то не так, просто, что это полная тайна. И когда match работают таким образом, почему бы и нет if и for?

Кто-нибудь знает? Я не думаю, что смогу больше использовать язык, не узнав об этом. Я думаю об этом все время. Я с трудом могу спать по ночам.

+1

Учитывая, что можно написать * подобный * подобный методу метод (поскольку '{case ..}' создает PartialFunction), то выражение 'expr match {..}' можно рассматривать как синтаксис. Поддержка Scala для «бесчисленного метода» invocation "для' expr.match {..} ', тогда он будет соответствовать пользовательскому методу' expr.myMatch {..} '->' expr myMatch {..} '. Он также сохраняет согласованность с 'catch'. – user2246674

+0

Hm. Правильно. Это похоже на одну действительную теорию. Люди Scala очень легко интегрируют пользовательские выражения, чтобы они выглядели как родные. Спасибо вам за ваши мысли по этому вопросу! Но остается вопрос: зачем только «матч»? – Lii

+1

Я * думаю * Я видел этот выбор синтаксиса, о котором говорилось ранее (в соавторстве соавтором моего Мартина?), Но я не могу вспомнить, где. С другой стороны, синтаксис Scala иногда является тем, что я считаю «чрезмерно гибким». – user2246674

ответ

7

Для того, чтобы подобные немного синтаксиса Scala, охранники в шаблоне соответствующих случаях не требуют скобок вокруг их условных выражений-например, следующее:

case i if i % 2 == 0 => i/2 

так же действуют, как это:

case i if (i % 2 == 0) => i/2 

Придерживаясь стиля C-семейства, это означает, что требуется последняя форма, даже если скобки не нужны для устранения неоднозначности. Разработчики языка Scala решили, что снижение линейного шума привело к тому, что в этом случае семейное сходство сведено.

Я думаю, что подобная мотивация на работу в синтаксисе match, и на мой взгляд match (expr) { ... } действительно выглядит довольно ужасно (и вводит в заблуждение) по сравнению с expr match { ... }.

Кроме того, только сегодня днем ​​я реорганизовал чужие x match { ... } на Option на x map { ... } вместо этого. match как оператор инфикса делает очевидным сходство между этими двумя выражениями.

По вопросу о том, почему match это не просто метод, вот пять лет вопрос от Дэвида Поллака на the scala-debate mailing list:

Почему «матч» уровень языковой конструкцией, а не метод на Любые?

И Martin Odersky's answer:

Раньше считалось, что путь в Scala 1. Я больше не знаю, почему мы изменили. подсветка синтаксиса? Отчет об ошибках? не уверен. Я не думаю, что имеет значение в любом случае.

Я с Мартином на этом.

Обратите внимание, что существует несколько практических различий (кроме простого вопроса «точка или нет»).Например, это не компилируется:

def foo[A, B](f: PartialFunction[A, B])(a: A) = a match f 

Если match еще метод на Any, требуя буквальным кучу случаев будет довольно странное требование.

+0

Выполнение 'expr match {...}' для 'expr map {...}' интересное примечание. Иногда я сталкиваюсь с этим. 'expr foreach {...}' также. –

+0

К сожалению, теперь связь с ответом Мартина Одерского нарушена. –