Re[19]: Действительно ли ML языки хороши в компиляторописани
От: Mamut Швеция http://dmitriid.com
Дата: 27.04.08 16:13
Оценка:
SR>Вы не поняли изначально. В вашем коде и моем нет сопоставления цикл — pattern matching. А есть сопоставление цикл — рекурсия.
SR>А нужна она для того, чтобы после разбора начала списка, разобрать хвост списка. Это же стандартная тема сопоставления ФП и ИП.

Ничего не понял

M>>И это называется удобным???


M>>На каждый случай писать свою, отдельную, специализированную функцию, заточенную под разбор только данного конкретного случая?

SR>Гм, у вас какое-то преувеличение насчет списков. Эта структура данных известна давным давно, все с ней более менее ясно.


Причем тут списки? Идет речь не о списках, а о произвольных структурах.

SR>С чего вы взяли, что там отдельная специализированная функция? Там обобщенная. А класс Response всего лишь обертка, которую можно и не заводить.

SR>Я же его завел, потому что мне хотелось иметь инфиксную форму вызова matches.
SR>А так было бы,
SR>
SR>boolean matches(Object[] list, Object[] pattern) {
SR>}
SR>

SR>И сопоставлять она будет списки с произвольной структурой.
SR>В который уже раз повторяю — обратите внимание, практически всегда, когда идет нахваливание сопоставления с образцом речь идет о вариантах, а не о просто списках.

Так никто про списки изначально и не говорил


M>>На четырех простейших примерах — это уже четвертая такая функция.

SR>Не четыре, а два и приводилась декларативная форма представления. А как это реализовано внутри не важно, главное, что можно сделать это обобщенно.

Как это реализовано внутри — это очень важно. Во всех примерах на Яве приходилось задвигать передаваемые данные в прокрустово ложе if'а (case'а), потому что ни if ни case не разбирают структуру разбираемых данных.

SR>Неужели считаете, что в Scala сопоставление со списком и с вариантами это одна функция? Конечно, это может быть и так, но скорее всего их тоже две.


Да, но прогарммисту, это использующему — абсолютно все равно:
case input_data of
    [{elem1, elem2}|T] -> сделаем что-то одно
    [[L]|T] -> разбираем вложенный список
    {a, b} -> а ждесь вообще не список, оппаньки
    {[H|T], [H2|T2]} -> и здесь не список передали. но внутри список
    {a, {b, {c, d}}} -> здесь списком даже и не пахнет, но все разобрали
    {_, _, _, _, x} -> нам важен только 5-й параметр, хотя струкутра может быть такой:
    {{a, b, c}, [H|T], {[H2|T2]}, d, e} -> и все равно мы ее сможем разобрать
end




M>>ПМ позволяет использовать унифицированый подход к разбору как структуры так и значений:

SR>Сопоставление с образцом в Java позволяет ровно тоже самое.

Не позволяет. Его в Яве нет. Все, что есть — это if/case, которые структуру разобрать не позволяют.


M>>Я с удовольствием посмотрю на общую функцию match, которая разберется со всеми этими примерами одним махом.


SR>[поскипаны примеры псевдокода]


что за list.match()? кто его написал? откуда он взялся? он будет работать для произвольных данных?


M>>Сомневаюсь. Выше приведено четыре примера, на каждый из которых с нашей стороны был приведен простейший декларативный код с ПМом, а с вашей — четыре разные функции, которые еще и накладывают ограничения на реализацию (например, необходимость реализации метода equals в первом примере)


SR>С моей стороны функции, не приводились, а приводился лишь образец для сопоставления.

SR>И случаев относящихся к сопоставление с образцом не четыре, а два. Сопоставление со списком, и сопоставление с вариантами.

И для каждого случая пришлось писать отдельную функцию, разбирающую отдельную структуру только в данном конкретном случае для того, чтобы вернуть true/false, чтобы это можно было проверить if/case'ом

M>>и if и case могут проверять только значения. ПМ позвляет проверять и структуру и значения сразу, без какойлибо дополнительной работы со сторноы программиста. В этом — главное и основное отличие

SR>Так же и при сопоставлении с образцом в Java.

Еще раз — Java такого не позволяет:

ПМ:
match({1, 2, 3}) ->
    ok;

match({"a", "b", "c"}) ->
    ok;

match([H|T]) ->
    ok.


Как общим кодом на Яве узнать, что:
— в первом случае у нас объект с тремя целочисленными полями
— во втором — с тремя текстовыми полями
— в третьем — вообще списко/массив
?

Более того, если нас не интересует тимп полей, а только их структура? Сколько перегруженых операторов equals придется писать для каждого отдельного случая?


dmitriid.comGitHubLinkedIn
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.