2016-01-01 2 views
0

Я разрабатываю функцию в Haskell, аргументом которой является список пар. Рекурсивно этот список будет разделен до тех пор, пока базовый случай не будет выполнен на основе предопределенного предиката. Обычно для более простых типов данных, например. списки, литералы могут использоваться для сопоставления базового случая, например «[]». Как я могу применить сопоставление образцов с использованием логического предиката?Предикатное приложение по аргументу для соответствия шаблону Haskell

Единственный способ, с помощью которого я пришел, - использовать инструкцию if else. Но, видимо, это привело бы к очевидной проблеме.

Узор

pure_instances [(_,_)] = True 
pure_instances ((c1,_):(c2,attrs):xs) = (c1 == c2) && (pure_instances ((c2,attrs):xs)) 

Метод

build_tree list = if (pure_instances list) then (Leaf get_label list) else (build_tree list) 
build_ tree list = ... 
+0

Это не для меня ясно, что «очевидно» проблема. Ваш код не имеет смысла ('pure_instances' не полностью применяется в' build_tree'), поэтому трудно понять, в чем проблема, или что вы просите. – crockeea

+0

Ты знаешь о стражах? –

+0

@ReidBatron Спасибо за подсказку, это вдохновило меня! –

ответ

1

Я думаю, что вы ищете охранников? (Спасибо Reid Barton)

build_tree list 
    | pure_instances list = Leaf get_label list 
    | otherwise   = build_tree list 

Бесконечный цикл, когда pure_instances возвращается False другое дело ...

Смежные вопросы