将元组与元组列表进行比较



我必须将元组与元组列表进行比较,如果整数小于列表中的任何元组,则返回True。就像如果我有superM ("Tomato",10,5) [("Potato",5,6),("Orange",11,6)]将返回True,因为单独元组("Tomate",10,5(中的整数小于列表中的元组("Orange",11,6(,但如果我有superM ("Melon",10,6) [("Potato",5,6),("Orange",11,6)]将返回False。

我试试这个

superM :: (String, Int, Int) -> [(String, Int, Int)] -> Bool
superM (s,a,b) ((_,c,d):xs)
| a < c && b < d = True
|otherwise =  superM (s,a,b) xs  

但当它假设返回False时不起作用,我不知道为什么?

注意:字符串对这个问题无关紧要,我必须忽略它。

您没有为空列表定义基本情况。因此,如果没有元素匹配,那么列表最终将耗尽,然后空列表将不匹配。因此,您可以为空列表添加一个规则:

superM :: (String, Int, Int) -> [(String, Int, Int)] -> Bool
superM _ [] = False
superM (s,a,b) ((_,c,d):xs)
| a < c && b < d = True
|otherwise =  superM (s,a,b) xs

我们可以利用一个逻辑或摆脱警卫:

superM :: (String, Int, Int) -> [(String, Int, Int)] -> Bool
superM _ [] = False
superM (s,a,b) ((_,c,d):xs) = a < c && b < d|| superM (s,a,b) xs

但我们也可以使用any :: Foldable f => (a -> Bool) -> f a -> Bool函数来让它与任何Foldable:一起工作

superM :: (Foldable f, Ord x, Ord y) => (a, x, y) -> f (b, x, y) -> Bool
superM (_, a, b) =anyp
where p (_, c, d) = a < c && b < d

相关内容

  • 没有找到相关文章

最新更新