Re[18]: Действительно ли ML языки хороши в компиляторописани
От: SmbdRsdn  
Дата: 26.04.08 21:46
Оценка: :)
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.