Здравствуйте, Mamut, Вы писали:
M>>>>>При этом с ПМ рекрсия по списку тривиальна
SR>>>>Неужели считаете, что цикл нетривиален?
M>>>Он менее "читаем", чем ПМ
SR>>Цикл это цикл, причем тут сопоставление с образцом? Сопоставление происходит уже внутри цикла.
M>M>match([]) ->
M> not_ok.
M>match([H|T]) ->
M> ok.
M>
M>намного понятнее. Тем более, что мы сразу на месте можем указать, что нам нужно:
Вы не поняли изначально. В вашем коде и моем нет сопоставления цикл — pattern matching. А есть сопоставление цикл — рекурсия.
А нужна она для того, чтобы после разбора начала списка, разобрать хвост списка. Это же стандартная тема сопоставления ФП и ИП.
M>И это называется удобным???
M>На каждый случай писать свою, отдельную, специализированную функцию, заточенную под разбор только данного конкретного случая?
Гм, у вас какое-то преувеличение насчет списков. Эта структура данных известна давным давно, все с ней более менее ясно.
С чего вы взяли, что там отдельная специализированная функция? Там обобщенная. А класс Response всего лишь обертка, которую можно и не заводить.
Я же его завел, потому что мне хотелось иметь инфиксную форму вызова matches.
А так было бы,
boolean matches(Object[] list, Object[] pattern) {
}
И сопоставлять она будет списки с произвольной структурой.
В который уже раз повторяю — обратите внимание, практически всегда, когда идет нахваливание сопоставления с образцом речь идет о вариантах, а не о просто списках.
M>На четырех простейших примерах — это уже четвертая такая функция.
Не четыре, а два и приводилась декларативная форма представления. А как это реализовано внутри не важно, главное, что можно сделать это обобщенно.
Неужели считаете, что в Scala сопоставление со списком и с вариантами это одна функция? Конечно, это может быть и так, но скорее всего их тоже две.
M>ПМ позволяет использовать унифицированый подход к разбору как структуры так и значений:
Сопоставление с образцом в Java позволяет ровно тоже самое.
M>Я с удовольствием посмотрю на общую функцию match, которая разберется со всеми этими примерами одним махом.
M>M>match({0, x}) ->
M> 0;
M>match({1, x}) ->
M> x;
M>match({a, b}) ->
M> a*b;
M>
Match x = new Match();
if (list.matches(0, x))
return 0;
if (list.matches(1, x))
return x.value;
Match a = new Match, b = new Match();
if (list.matches(a, b))
return a.value * b.value;
M>M>match({Field, Rule}) ->
M> match_rule(Field, Rule);
M>match(Field) when is_atom(Field) ->
M> field_exists(Field)
M>match_rule(Field, {Func, Value}) ->
M> Func(Field, Value);
M>
Match field = new Match(), rule = new Match();
if (list.matches(field, rule)) {
Match func = new Match(), value = new Match();
if (rule.value.matches(func, value))
return func.value(field.value, value.value);
}
if (list.matches(field))
return fieldExists(field.value);
M>M>match([]) ->
M> ok;
M>match({i, _, empty}) ->
M> ok;
M>match({i, m, {'Cons', x, y}}) ->
M> ok;
M>
if (list.matches())
return ok;
Match i = new Match(), empty = new Match();
if (list.matches(i, _, empty))
return ok;
Match m = new Match(), x = new Match(), y = new Match();
if (list.matches(i, m, list("Cons", x, y)))
return ok;
M>M>match({ok, {{Version, 200, ReasonPhrase}, Headers, Body}}) ->
M> ok;
M>match({ok, {{_, 404, ReasonPhrase}, _, _}}) ->
M> ok;
M>
Match ok = new Match(), version = new Match(), reasonPhrase = new Match(), headers = new Match(), body = new Match();
if (list.matches(ok, list (version, 200, reasonPhrase), headers, body)
return ok;
if (list.matches(ok, list (_, 404, reasonPhrase), _, _)
return ok;
M>Сомневаюсь. Выше приведено четыре примера, на каждый из которых с нашей стороны был приведен простейший декларативный код с ПМом, а с вашей — четыре разные функции, которые еще и накладывают ограничения на реализацию (например, необходимость реализации метода equals в первом примере)
С моей стороны функции, не приводились, а приводился лишь образец для сопоставления.
И случаев относящихся к сопоставление с образцом не четыре, а два. Сопоставление со списком, и сопоставление с вариантами.
Остальные два варианта с функцией validate и c циклом приводились, для уточнения условий задачи и там, действительно или не использовалось или не было ярко выражено сопоставление с образцом.
SR>>Если бы вы внимательно посмотрели на код с equals то увидели бы, что там далеко не все значения используются в дальнейшем.
M>Зачем их тогда упоминать? 
Как раз, чтобы показать, что сопоставлять можно со структурой, отдельные элементы которой, могут быть не важны.
M>и if и case могут проверять только значения. ПМ позвляет проверять и структуру и значения сразу, без какойлибо дополнительной работы со сторноы программиста. В этом — главное и основное отличие
Так же и при сопоставлении с образцом в Java.