我必须将元组与元组列表进行比较,如果整数小于列表中的任何元组,则返回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