M>>Правильно. И такой код придется писать каждый раз заново для любой более-менее тривиальной смены структуры передаваемых данных.
SR>Какой такой? Цикл по списку? Так это аналог рекурсии по списку, которую тоже придется писать каждый раз.
При этом с ПМ рекрсия по списку тривиальна
M>>То есть. Для исхдного примераАвтор: z00n
Дата: 14.12.07
придется реализовывать метод equals для term,
SR>Метод equals легко автоматизируется, также как создание getter, setter и конструктора по полям в eclipse.
{ok, {{Version, 200, ReasonPhrase}, Headers, Body}} =
http:request(...
{ok, {_, _, Body}} = http:request(...
{ok, {_, 200, _}, _, _} = http:request(
Какой-какой автоматизированый equals мне поможет это написать?
SR>Я уж молчу про поддержку со стороны компилятора.
Я тоже умолчу
M>>для моего примера — целую отдельную функцию, эмулирующую сопоставление с образом,
SR>Странно, стороннику ФП не нравятся отдельные функции. Ну раз не нравятся объедините в одну большую.
В какую ону большую? В Tom что ли?
M>>для менее тривиального примераАвтор: z00n
Дата: 24.04.08
придется еще как-нибудь изворачиваться.
SR>Пример не более тривиален чем исходный.
| {i,FLT,{'Break',s}} :: z -> return best(emit(sb,s),n,k+#s,z)
| {i,BRK,{'Break',_}} :: z -> return best(nl(sb,i),i,i,z)
| {i,FLT,{'Group',x}} :: z -> return best(sb,w,k,{i,FLT,x}::z)
это, я так понимаю, предлагается переписать в виде
if(term.m == FLT && term.cell.type == 'Break' && term.cell.data == s)
{
}
else if(term.m == BRK && term.cell.type == 'Break')
{
}
else if(term.m == FLT && term.cell.type == 'Group' && term.cell.data == x)
{
}
?
M>>А ПМ позвлит все задачи решить декларативно. Это не магическая пуля, конечно, писать все равно придется
Но каждый раз это будет легко и — главное! — одинаково.
SR>Так все задачи или не магическая пуля?
Любая, где требуется разбор структур (данных). Сопоставление с образцом — это
унифицированый подход к разбору
произвольных структур(данных)
M>>Просто if поможет только сравнить значения. ПМ позволит наглядно сравнить и структуру и значения.
SR>Какая структура в вашем-то примере?
rules_list = [fields_and_rules]
fields_and_rules = [field_rules]
field_rules = {field} | {field, Rules}
Rules = Rule | [Rule]
Rule = function | OperatorRule | FunctionRule
OperatorRule = {Operator, value} | (Operator, field)
Operator = '=' | '/=' | '<' | '=<' | '>' | '>='
FunctionRule = {function, value} | {function, field}
Как придумал, так и записал. Более того, реализация сильно похожа на то же самое
Но у меня, безусловно, простой пример. А есть посложнее. Типа того, что я привел в самом начале.
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>