2017-01-19 10 views
0

Я пытаюсь реализовать список, который ищет определенный шаблон в Tuple (проходит через список Tuples, пустет это, а затем записывает те, которые соответствуют шаблону) в конце список, который я ввел, будет пустым, а затем он напишет соответствующие кортежи в этом списке.Ошибка Haskell: не-exhausive шаблоны в функции

(Функции, используемые делать всю работу - ошибка в этой части)

PatternFinder :: String -> [(String, String)] , [(String, String)] 
PatternFinder = n ((b,a) : xs) = 
if PatternFits n a 
then do 
PatternFinder n xs 
(b,a) : xs 
else PatternFinder n xs 
+1

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

ответ

2

Из текста Вашего вопроса, то кажется, что вы хотите простой фильтр, основанный на втором члене каждой пары.

patternFinder n = filter (patternFits n . snd) 

В качестве иллюстрации того, как это работает.

filter ((==1) . snd) [('a',1),('b',2),('c',1)] 

возвращает [('a',1),('c',1)]

В Чаде Gilberts ответ, однако, нет рекурсии в то пункте:

if patternFits n a 
then (b,a) : xs 
else patternFinder n xs 

Это вернет суффикс списка после первого матча. Если это предполагаемое поведение, можно использовать вместо:

patternFinder n = dropwhile (not . patternFits n . snd) 

В качестве примера этого:

dropWhile (not . (==2) . snd) [('a',1),('b',2),('c',1)] 

возвращает [('b',2),('c',1)]

Кроме того, в тексте Вашего вопроса вам необходимо, чтобы список, который вы ввели, будет пустым. Обратите внимание, что эти функции ничего не делают для исходного списка, но возвращают новые списки.

+0

Ничего себе, это хорошо объяснено, и я на самом деле пытался выяснить, как это работает прямо сейчас - спасибо за хорошую помощь :) – Fapprentice

2

Вы не случай второго аргумента, являющегося пустой список. Для того, чтобы быть исчерпывающими, вы должны справиться с этой схемой:

patternFinder n [] 

Вы также получили другие синтаксические ошибки. Названия функций должны начинаться с буквы нижнего регистра, подписи разделяются ->, а не ,, и вам не нужен оператор do, потому что вы не в контексте монады. Это должно выглядеть примерно так:

patternFinder :: String -> [(String, String)] -> [(String, String)] 
patternFinder n [] = [] 
patternFinder n ((b,a) : xs) = 
    if patternFits n a 
    then (b,a) : xs 
    else patternFinder n xs 
+0

Я попробовал это, добавив «patternFinder n [] = xs», однако я всегда получал переменную не в области ... – Fapprentice

+0

Должна быть проблема, связанная со мной, сначала опуская список, а затем пытаюсь записать в него снова, однако я не знаю, как решить эту проблему ... – Fapprentice

+0

У вас есть много других синтаксических ошибок –

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

  • Нет связанных вопросов^_^