繁体   English   中英

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

[英]Haskell- recursively check elements of associative list

说我有以下关联列表:

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. 您的数据具有数字和字符串,但是您的函数读取字符串和数字。 因此必须更改为此

     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

在线演示


就这样,您可以通过以下方式使函数变为多态

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

要了解有关Eq a更多信息,请检查此出色的答案


只是为了完整起见,您总是可以使用elem函数,像这样

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM