2015-01-30 3 views
1

Скажем, у меня есть следующий ассоциативный список:Haskell- рекурсивно проверить элементы ассоциативного списка

names = [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")] 

Я хочу, чтобы проверить, является ли данный кортеж, такие как ...

(6548712, "Charlie Brown") 

... существует в ассоциативном списке.

Вот моя функция:

check :: (String,a) -> [(String,a)] -> Bool 
check val (x:xs) 
    | x == val = True 
    | otherwise = check val xs 

Функция не работает. Я думаю, что ошибка заключается в моем первом страже, так как я верю, что мой рекурсивный звонок правильный. Я хочу, чтобы иметь возможность сделать это, используя рекурсию, может кто-то помочь мне?

ответ

2
  1. Ваши данные имеют Number и String, но ваша функция читает строку и номер. Так что должно быть изменено на этот

    check :: (Int, String) -> [(Int, String)] -> Bool 
    
  2. Ваш рекурсии должен иметь базовое состояние, как это

    check val [] = False 
    

    Это означает, что если список пуст (все элементы проверяются), возвращение False ,

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

check :: (Int, String) -> [(Int, String)] -> Bool 

check val [] = False 
check val (x:xs) 
    | x == val = True 
    | otherwise = check val xs 

Online Demo


Как это, вы можете сделать свою функцию Полиморфные делая

check :: Eq a => (a, String) -> [(a, String)] -> Bool 

Чтобы узнать больше о Eq a, пожалуйста, проверьте this excellent answer


Только ради завершения, вы всегда можете использовать функцию elem, как этот

Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")] 
True 
+0

Кроме того, эта функция может быть более полиморфными. – Sibi

+0

Это может быть более кратким: 'check :: Eq a => a -> [a] -> Bool' :) – Sibi

+0

@Sibi Правильно, но это выглядит более понятным и понятным? :) – thefourtheye

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