2014-09-30 5 views
0

У меня есть привязка к шаблону и выполняю некоторую операцию над каждым элементом в рекурсивно.Соответствие шаблону операции в Haskell

[(Int, Char, Int)] 

Я нашел свой путь вокруг, как правильно сопоставление с образцом его для доступа к каждому элементу, как показано ниже:

((q1, s, q2):tss) 

с этим я могу сделать некоторые операции проверки на каждый элемент в списке. то, что я намереваюсь сделать, - это рекурсивно выполнить ту же операцию над остальными элементами в кортеже, которые в этом случае являются tss.

Это часть кода я отправляю здесь:

case ts of 
[] -> False 
((q1, s, q2):tss) | not (q1 `elem` qs) -> False 
        | not (s `elem` qs) -> False 
        | not (q2 `elem` qs) -> False 

Как я должен рекурсивно сделать то же тестирование на TSS? Идеи будут оценены.

+0

Пожалуйста, по крайней мере, опубликуйте полное определение. Что такое 'qs'? – luqui

+0

Вы хотите получить список 'Boolean' или хотите проверить, все ли элементы заполнены вашей собственностью (или вы хотите проверить, по крайней мере, один из них?) – Carsten

+0

Лучше всего, если вы просто дадите нам образец ввода и нужный вывод для него;) – Carsten

ответ

5

Во-первых, написать функциональный тест

test (q1, s, q2) = q1 `elem` q1List && 
        s `elem` sList && 
        q2 `elem` q2List 

с ним вы можете пройти

map test tss 

(используйте map, filter, fold ... как вам нужно).

Прямой способ сделать это может быть

mapTest [] = [] 
mapTest (t:tss) = test t: mapTest tss 

(но это простой map)

полный пример

multipleCheck q1List sList q2List tss = traverse tss 
    where traverse []  = [] 
     traverse (t:tss) = check t: traverse tss 

     check (q1, s, q2) = q1 `elem` q1List && 
          s `elem` sList && 
          q2 `elem` q2List 

main = print $ multipleCheck [1..5] "abc" [2,3,5] [(1,'b',3), (1,'b',4)] 

с выходом

[True,False] 
1

Functi по определениям обычно выписываются в статьях; охранявшие выражения, которые возвращают логические значения могут быть заменены только логическими выражениями:

g qs [] = False    -- should be True 
g qs ((q1, s, q2):tss) = 
       ((q1 `elem` qs) && 
       (s `elem` qs) &&     -- the three checks 
       (q2 `elem` qs) &&) && g qs tss -- and the recursive call 

qs Переходит в качестве параметра g так, что g имеет к нему доступ. В противном случае qs должно быть глобальным предопределенным значением.

Возвращаемое значение базового аргумента должно быть True, а не False, иначе ваша функция всегда будет возвращать False для любого ввода.

Кстати, g qs tss = all (\(a,b,c)-> all (`elem` qs) [a,b,c]) tss = and (map (\(a,b,c)-> all (`elem` qs) [a,b,c]) tss). Оба all и and являются так называемыми "folds", поэтому g также.

Если вы хотите, чтобы выполнить тот же тест на каждом кортеже и получить список результатов назад в качестве общего результата, вам просто нужно изменить, как вы совмещаете рекурсивные результаты:

g qs [] = []    -- False  -- it is a list now, not a Boolean 
g qs ((q1, s, q2):tss) = 
       ((q1 `elem` qs) && 
       (s `elem` qs) &&    -- the three checks 
       (q2 `elem` qs) &&) : g qs tss -- and the recursive call 
         --   ^^^ here 

И это map от выше, только без and. map также является своего рода «сгибом».

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