【问题标题】:Checking if a given Integer is the first element of a tuple in a list of tuples检查给定的整数是否是元组列表中元组的第一个元素
【发布时间】:2019-10-07 15:04:26
【问题描述】:

我有一个任务,我需要检查给定的 Int 是否是元组列表中任何元组的第一个元素。例如,如果我想检查1 是否是列表[(2,3), (3,3), (2,7)] 上任何元组的第一个元素,它应该返回False,但是,如果我想检查1 是否是列表中的第一个元素[(2,2), (1,2), (3,4)],它应该返回True。 这是我的尝试:

    isFirst :: (Eq a) => a -> [(a,b)] -> Bool
    isFirst _ [] = False
    isFirst x [(y1, y2)] = x == y1
    isFirst x  ((y1, y2):l) = if y1 : isFirst l then True 
                                else False

我还是 Haskell 的新手,所以我真的不知道我是否接近正确的解决方案,感谢您的帮助!

【问题讨论】:

    标签: haskell


    【解决方案1】:

    修改函数的方法如下:

    isFirst :: (Eq a) => a -> [(a,b)] -> Bool
    isFirst _ [] = False
    isFirst x [(y1, y2)] = x == y1
    isFirst x  ((y1, y2):l) = (x == y1) || isFirst x l
    

    早期的实现有什么问题?

    y1 : isFirst l 表示您想将y 添加到isFirst l 生成的列表的开头。但是isFirst 应该返回一个Bool,这样就行不通了。

    解决方法是什么?

    显式检查第一个元组,然后递归调用列表其余部分的isFirst。用 OR 连接这两个检查将是一个逻辑上正确的操作,因为每个检查都返回一个 Bool 结果。

    【讨论】:

      【解决方案2】:

      我们可以在这里使用any :: Foldable f => (a -> Bool) -> f a -> Bool 来检查是否有任何 2 元组的第一个元素与我们正在寻找的元素相等:

      isFirst :: Eq a => a -> [(a,b)] -> Bool
      isFirst x ys = any (\(y, _) -> x == y) ys
      

      或更短:

      isFirst :: Eq a => a -> [(a,b)] -> Bool
      isFirst x = any ((==) x . fst)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2021-12-07
        • 2020-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多