haskell - 检查给定的 Integer 是否是元组列表中元组的第一个元素

标签 haskell

我有一个作业,需要检查给定的 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 还很陌生,所以我真的不知道我是否接近正确的解决方案,感谢您的帮助!

最佳答案

以下是修改该函数的方法:

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 结果。

关于haskell - 检查给定的 Integer 是否是元组列表中元组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58263323/

相关文章:

haskell - 遍历抽象语法树时如何使用 Reader Monad

haskell - haskell中的斐波那契序列返回所有值

list - 扫雷板标签(初级)

haskell - 我该怎么写, "if typeclass a, then a is also an instance of b by this definition."

list - 在列表中查找元素的前一个元素(Haskell)

multithreading - Spark 产生多少开销?

haskell - 从 "local hackage"安装软件包(通过 cabal)

string - 为什么 Haskell 的默认字符串实现是一个字符的链表?

haskell - 秒差距和逗号输入序列

list - 列表中的下一个元素