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:找不到模块 `Data.List.Split'

haskell - 有没有办法解决haskell中的类型同义词?

haskell - Haskell-Project Euler 4

haskell - 尝试创建一个将另一个函数映射到函数列表的函数

haskell - 如何将 Haskell 中的匿名函数的折叠重写为常规函数?

haskell - 如何将 TChan 邮箱附加到线程并使用套接字接收/发送消息?

haskell - 在 Haskell 中读取 YAML

haskell - 如何让 Reader 和 ReaderT 协同工作

haskell - 了解 GHC 汇编输出

haskell - 在 Yesod 生态系统中,对一些文本进行 urlencode 的最佳方式是什么?