2015-08-29 6 views
-2

Я знаю, как проверить, если строка содержит определенный характер, как это:Проверьте, если строка содержит определенный символ, используя рекурсию

charFound :: Char -> String -> Bool 
charFound c s = c `elem` s 

Теперь, как я мог бы иметь такой же подход, используя рекурсию?

Кроме того, с помощью Pattern Matching, чтобы проверить, если один из параметров пуст, я получаю

Анализировать Ошибка в шаблоне: '' s

charFound:: Char->String->Bool 
charFound '' s = error "Something is empty." -- ERROR 
charFound c "" = error "Something is empty." -- OK 

Могу ли я использовать _ игнорировать параметр с чем-то, что не является списком?

Update данный код

charFound :: Char->String->Bool 
charFound c (x:xs) 
    | c == x = True 
    | xs == "" = False 
    | otherwise = contido c xs 

Также

charFound :: Char->String->Bool 
charFound _ "" = False -- returns false if I type > charFound 'a' "Leh" 
charFound c (x:xs) 
    | c == x = True 
    | otherwise = contido c xs 
+0

'elem' является рекурсивной функцией. Вы можете попробовать его реализовать или проверить в документации, как это реализовано. – duplode

+0

От LearnYouaHaskell.com: Рекурсия на самом деле является способом определения функций, в которых функция применяется внутри собственного определения. – PlayHardGoPro

+0

Вам не хватает пустого совпадения шаблона списка и вместо этого имеет забавный смс ненужный тест для пустого списка в непустой случай. – dfeuer

ответ

4

Мы можем сохранить ту же сигнатуру, потому что функция делает то же самое.

charFound :: Char -> String -> Bool 

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

charFound c "" = False 

Теперь вы должны рассмотреть другой случай, когда строка не пуста. Если строка не пустая, то она имеет вид (x:xs), и если x равно нашему символу, мы возвращаем true, в противном случае мы проверяем, находится ли c в xs.

charFound c (x:xs) 
    | c == x = True 
    | otherwise = charFound c xs 

В качестве альтернативы,

charFound c (x:xs) = c == x || charFound c xs 

Edit: Чтобы ответить на дополнительные вопросы относительно соответствия шаблонов, вы получаете это предупреждение, потому что '' не персонаж! Персонаж никогда не может быть пустым, поэтому вам не нужно учитывать эту возможность. Кроме того, вы определенно можете использовать _ для соответствия тому, что не является списком. Вы можете использовать _ для соответствия любому параметру. Например, базовый вариант может быть записана в виде

charFound _ "" = False 

Потому что мы на самом деле не нужно знать, что значение символа, когда строка пуста, поэтому мы не должны дать ему имя.

+0

Спасибо человек. Я добавил еще одну вещь о Match Matching. Не могли бы вы дать мне руки? – PlayHardGoPro

+0

Было ли мое редактирование ответом на ваш вопрос? – JHobern

+0

Почти идеальный.Но когда я печатаю пустую строку, я получаю «Исключение: t4.hs: (26,1) - (28,29): Неисчерпывающие шаблоны в функции charFound« – PlayHardGoPro

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