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

List Haskell-递归检查关联列表的元素,list,haskell,recursion,tuples,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 ==

假设我有以下关联列表:

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
该函数不起作用。我认为错误在于我的第一个防范措施,因为我确实相信我的递归调用是正确的。我希望能够使用递归实现这一点,有人能帮我吗

  • 数据有数字和字符串,但函数读取字符串和数字。所以必须改成这个

    check :: (Int, String) -> [(Int, String)] -> Bool
    
  • 递归应该有一个基本条件,如下所示

    check val [] = False
    
    check :: (Int, String) -> [(Int, String)] -> Bool
    
    check val [] = False
    check val (x:xs)
        | x == val = True
        | otherwise = check val xs
    
    Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
    True
    
    这意味着如果列表为空(选中所有元素),则返回
    False

  • 所以你的函数应该是这样的

    check val [] = False
    
    check :: (Int, String) -> [(Int, String)] -> Bool
    
    check val [] = False
    check val (x:xs)
        | x == val = True
        | otherwise = check val xs
    
    Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
    True
    


    实际上,您可以通过执行以下操作使函数具有多态性

    check :: Eq a => (a, String) -> [(a, String)] -> Bool
    
    要了解更多关于等式a的信息,请查看


    为了完成,您可以始终使用函数,如下所示

    check val [] = False
    
    check :: (Int, String) -> [(Int, String)] -> Bool
    
    check val [] = False
    check val (x:xs)
        | x == val = True
        | otherwise = check val xs
    
    Prelude> elem (6548712, "Charlie Brown") [(6548712, "Charlie Brown"), (27378912, "Linux Van Pelt"), (5831457, "Peppermint Patty")]
    True
    

    此外,函数可以更多态。它可以更简洁:
    check::Eq a=>a->[a]->Bool
    :)@Sibi对,但这看起来更清晰易懂,对吗?:)我同意这一点