Haskell-递归检查关联列表的元素

时间:2015-01-30 06:06:26

标签: list haskell recursion tuples

说我有以下关联列表:

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

该功能不起作用。我认为错误在于我的第一个警卫,因为我相信我的递归调用是正确的。我希望能够使用递归来做到这一点,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

  1. 您的数据有数字和字符串,但您的函数读取字符串和数字。所以必须改为这个

    check :: (Int, String) -> [(Int, String)] -> Bool
    
  2. 你的递归应该有一个基本条件,比如

    check val [] = False
    

    这意味着如果列表为空(检查了所有元素),则返回False

  3. 所以你的功能应该是这样的

    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