Блог о понимании паттерн-матчинга (автор Ziaw)
От: Ziaw Россия  
Дата: 16.05.11 07:23
Оценка: 222 (8)
Здравствуйте, Аноним, Вы писали:

А>Я честно скажу, что сейчас толком не понимаю происходящее ни в том ни в другом случае, но в Boo хотя бы можно поразбираться — вполне читаемый код для любого знакомого с шарпом. От кода немерля же начинают болеть глаза на 15 секунде.


Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.

http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html

16.05.11 18:45: Ветка выделена из темы Круто, но до чего же тяжелый синтаксис
Автор:
Дата: 14.05.11
— VladD2
Re: Блог о понимании паттерн-матчинга (автор Ziaw)
От: breee breee  
Дата: 16.05.11 15:13
Оценка: 16 (1)
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Я честно скажу, что сейчас толком не понимаю происходящее ни в том ни в другом случае, но в Boo хотя бы можно поразбираться — вполне читаемый код для любого знакомого с шарпом. От кода немерля же начинают болеть глаза на 15 секунде.


Z>Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.


Z>http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html

match (i)
{
  | 1 => Console.WriteLine(1)
  | 2 => Console.WriteLine(2)

  | 3
  | 4
  | 5
  | x => Console.WriteLine(i)  // или x?
}


def lst2 = 42 :: lst2; // или lst1?

Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.05.11 15:24
Оценка:
Здравствуйте, breee breee, Вы писали:

Z>>http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html

BB>[q]
BB>
BB>match (i)
BB>{
BB>  | 1 => Console.WriteLine(1)
BB>  | 2 => Console.WriteLine(2)

BB>  | 3
BB>  | 4
BB>  | 5
BB>  | x => Console.WriteLine(i)  // или x?
BB>}
BB>


"| x " — это паттерн "переменная". Он сопоставляется с любым значением и переменная (x в данном случае) связывается со значением. Более правильно было бы переписать этот код так:
switch (i)
{
  case 1: Console.WriteLine("one"); break;
  case 2: Console.WriteLine(2); break;
  default: 
    var x = i;
    Console.WriteLine(x)
}

только x будет неизменяемой переменной.

BB>
BB>def lst2 = 42 :: lst2; // или lst1?
BB>

Ага. Очевидно это опечатка. lst2 выше объявлен не был. Так что очевидно имелось в виду lst1.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: Ziaw Россия  
Дата: 16.05.11 15:44
Оценка:
Здравствуйте, breee breee, Вы писали:

BB>
BB>match (i)
BB>{
BB>  | 1 => Console.WriteLine(1)
BB>  | 2 => Console.WriteLine(2)

BB>  | 3
BB>  | 4
BB>  | 5
BB>  | x => Console.WriteLine(i)  // или x?
BB>}
BB>


Тут все таки i, это пример демонстрации нескольких паттернов на один экшен. В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя. Можно так, но это будет совсем смешно и, вообще, with я приберег для последующих постов.
match (i)
{
  | 1 => Console.WriteLine(1)
  | 2 => Console.WriteLine(2)

  | 3 with x = 3
  | 4 with x = 4
  | 5 with x = 5
  | x => Console.WriteLine(x)
}



BB>
BB>def lst2 = 42 :: lst2; // или lst1?
BB>

BB>[/q]

Тут опечатка, исправил, спасибо.
Re[3]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: breee breee  
Дата: 16.05.11 16:01
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Тут все таки i, это пример демонстрации нескольких паттернов на один экшен. В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя.


Вот оно что. Понятно, спасибо.
Re: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.05.11 16:25
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.


Z>http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html


Несколько уточнений.

По терминологии:
То что ты называешь паттерном "константа" на самом деле называется паттерн литерал.

То что ты называешь паттерном "идентификатор" на самом деле называется паттерн переменная.

Уточняющее условие называется защитник (guard).

Паттерны list и tuple являются отдельными типами паттернов, а не разновидностями паттерна конструктор. Точнее паттерна list нет. Вместо него есть List constructor pattern и List literal pattern.

Имеет смысл дать ссылки на EBNF-описания:
* Выражения match
* и паттерна

На русском введение в ПМ описывается в этой статье
Автор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.05.11 18:35
Оценка: 2 (1)
Здравствуйте, Ziaw, Вы писали:

Z>Уже не первый раз слышу о сложности понимания ПМ, попробовал написать небольшой пост на эту тему, возможно кому-то будет интересно.


Z>http://ziaw.blogspot.com/2011/05/pattern-matching-nemerle.html


Добавил примеров в описание ПМ: http://nemerle.org/wiki/Patterns_%28ref%29

Надо еще примеры для списков добавить и литералов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.05.11 20:04
Оценка: +1
Здравствуйте, Ziaw, Вы писали:

Z>Тут все таки i, это пример демонстрации нескольких паттернов на один экшен.


Тогда надо "_" использовать, чтобы предупреждений не было.

Z>В паттернах 3, 4, 5 x не определяется и его использовать соответственно нельзя. Можно так, но это будет совсем смешно и, вообще, with я приберег для последующих постов.

Z>
Z>match (i)
Z>{
Z>  | 1 => Console.WriteLine(1)
Z>  | 2 => Console.WriteLine(2)

Z>  | 3 with x = 3
Z>  | 4 with x = 4
Z>  | 5 with x = 5
Z>  | x => Console.WriteLine(x)
Z>}
Z>


Любой паттерн можно связать с переменной с помощью паттерна as:
match (i)
{
  | 3 as x | 4 as x | 5 as x => WriteLine(x)
  ...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: Ziaw Россия  
Дата: 17.05.11 09:32
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Несколько уточнений.


VD>По терминологии:

VD>То что ты называешь паттерном "константа" на самом деле называется паттерн литерал.

VD>То что ты называешь паттерном "идентификатор" на самом деле называется паттерн переменная.


Ок, поправлю. Хотя переменная мне не нравится.

VD>Уточняющее условие называется защитник (guard).


Это я уже написал, Хардкейс подсказал.

VD>Паттерны list и tuple являются отдельными типами паттернов, а не разновидностями паттерна конструктор. Точнее паттерна list нет. Вместо него есть List constructor pattern и List literal pattern.


По сути они и есть разновидности. Поскольку являются синтаксическим сахаром для вызова конструктора.

VD>Имеет смысл дать ссылки на EBNF-описания:

VD>* Выражения match
VD>* и паттерна

VD>На русском введение в ПМ описывается в этой статье
Автор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
.


Ок, дам ссылки.
Re[3]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.05.11 10:11
Оценка: +1
Здравствуйте, Ziaw, Вы писали:

Z>По сути они и есть разновидности. Поскольку являются синтаксическим сахаром для вызова конструктора.


Термины и названия придумывают для того чтобы потом можно было ссылаться на них в общении. Если ты объясняя суть вещей даешь другие названия или классификацию, то тем самым ты способствуешь формированию каши в голове у людей и усложняешь дальнешее общение. По этому важно использовать единую терминологию.

Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: Аноним  
Дата: 17.05.11 12:01
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.


Зачем множить сущности?

[1,2,3] == [](1,2,3)
head :: tail == :(head, tail)

Очевидно, что это конструкторы списка.
Отличия от конструкторов классов лишь в форме инфиксной или скобочной записи.
Re[5]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.05.11 13:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Зачем множить сущности?


Сущности не множатся. Есть отдельный синтаксис. Он и рассматривается отдельно.

А>[1,2,3] == [](1,2,3)

А>head :: tail == :(head, tail)

После "==" тут какая-то фигня.

А>Очевидно, что это конструкторы списка.

А>Отличия от конструкторов классов лишь в форме инфиксной или скобочной записи.

Я уже отвечал на этот вопрос. Просто читай внимательно написанное:

Паттерн "конструктор" — это термин описывающий конкретную синтаксическую конструкцию. У нее есть свой синтаксис и описание. На них можно дать ссылку. Паттерны же конструктор списка и литерал списка имеют свой, отличный синтаксис, а значит и ссылаться на них нужно отдельно.

Одно и то же выражение можно записать тремя способами:
    list.Cons(1, list.Nil());
    1 :: [];
    [1];

и их как-то надо отличать.
Потому и вводятся названия для типов паттерном.

Если человек, например, захочет прочитать описание синтаксиса, то название "паттерн конструктор" его только введет в заблуждение. А так все просто и очевидно. Есть паттерн "конструктор", есть паттерн "конструктор списка", и есть "литерал списка".

Вот так их и надо подавать. А то что все они порождают список можно объяснить отдельно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: Аноним  
Дата: 17.05.11 14:18
Оценка: +1 -1
Здравствуйте, VladD2, Вы писали:

VD>Сущности не множатся. Есть отдельный синтаксис. Он и рассматривается отдельно.

Такой же отдельный синтаксис есть и, например, в Haskell.
Тем не менее, в вопросе паттерн-матчинга соответствующие конструкции названы одинаково.

А>>[1,2,3] == [](1,2,3)

А>>head :: tail == :(head, tail)

VD>После "==" тут какая-то фигня.

Вероятно форум какие-то сочетания символов убирает. А в окне ответа, всё в первоначальном виде.

VD>Я уже отвечал на этот вопрос. Просто читай внимательно написанное:

Ссылка неисправна.

VD>Одно и то же выражение можно записать тремя способами:

VD>
VD>    list.Cons(1, list.Nil());
VD>    1 :: [];
VD>    [1];
VD>

VD>и их как-то надо отличать.
Не надо.
1 :: [] == [1] == list.Cons(1, list.Nil())

Также как не надо отличать "" и new String("")

VD>Если человек, например, захочет прочитать описание синтаксиса, то название "паттерн конструктор" его только введет в заблуждение. А так все просто и очевидно. Есть паттерн "конструктор", есть паттерн "конструктор списка", и есть "литерал списка".

Чем меньше терминов придется держать новичку в голове, тем быстрее понимание.
Re[2]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: i1yich  
Дата: 17.05.11 19:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Добавил примеров в описание ПМ: http://nemerle.org/wiki/Patterns_%28ref%29


Про паттерн where там ничего не сказано.

Кстати, можно ли употреблять этот паттерн без where, когда важен только тип разбираемого значения, но не важны его свойства?

Понимаю, что можно использовать паттерн _ is Type, но тогда он выбивается из общего ряда, как здесь:

  match (result: Result) {
     | Result.Fail where (Error = e) => Console.WriteLine($"failed with error: $error");
     | _ is Result.Success => Console.WriteLine("success");
  }


Здесь Result — абстрактный класс с наследниками Result.Success и Result.Fail.
Re[3]: Блог о понимании паттерн-матчинга (автор Ziaw)
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.05.11 19:37
Оценка:
Здравствуйте, i1yich, Вы писали:

VD>>Добавил примеров в описание ПМ: http://nemerle.org/wiki/Patterns_%28ref%29


I>Про паттерн where там ничего не сказано.


http://nemerle.org/wiki/Patterns_%28ref%29#record_pattern

I>Кстати, можно ли употреблять этот паттерн без where, когда важен только тип разбираемого значения, но не важны его свойства?


Используй паттерн is.

I>Понимаю, что можно использовать паттерн _ is Type, но тогда он выбивается из общего ряда, как здесь:


I>
I>  match (result: Result) {
I>     | Result.Fail where (Error = e) => Console.WriteLine($"failed with error: $error");
I>     | _ is Result.Success => Console.WriteLine("success");
I>  }
I>


Да, нормально.
is короче. Я вот все думал от where избавиться. Удлинняет сильно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.