我有一个作业,需要检查给定的 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/