【问题标题】:Haskell- recursively check elements of associative listHaskell-递归检查关联列表的元素
【发布时间】:2015-03-29 14:08:37
【问题描述】:

假设我有以下关联列表:

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

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

【问题讨论】:

    标签: list haskell recursion tuples


    【解决方案1】:
    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
    

    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
    

    【讨论】:

    • 另外,函数可以更加多态。
    • 可以更简洁:check :: Eq a => a -> [a] -> Bool :)
    • @Sibi 对,但这看起来更清晰易懂对吧? :)
    • 我同意这一点。 :)
    猜你喜欢
    • 2018-02-20
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多