我有这个功能:
pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)
我必须根据Pairs编写另一个,如果至少有一对元组按升序排列,则返回True(例如(2,3))。
这是我对此的尝试:
unsorted :: Ord a => [a] -> Bool
unsorted xs = [if fst x < snd x then True else False| x <- pairs xs]
为什么这是错的?
答案 0 :(得分:3)
您的函数会返回Bool
的列表,而不是Bool
。您可以使用any
:
unsorted xs = any (\x -> fst x < snd x) xs
或
unsorted = any (\(x, y) -> x < y)
如果您想使用列表推导,可以添加过滤器,然后查看结果列表是否包含任何元素:
(length [x | x <- pairs xs, fst x < snd x]) > 0
或
(length [x | (x,y) <- pairs xs, x < y]) > 0
答案 1 :(得分:2)
查看GHC给出的类型错误应该给出一个关于错误是什么的提示。
Couldn't match expected type `Bool' with actual type `[Bool]'
您的签名表示您希望返回Bool
,但您的实施会产生Bools
的列表。要解决此问题,请使用函数(any :: (a -> Bool) -> [a] -> Bool
):
unsorted :: Ord a => [(a, a)] -> Bool
unsorted xs = any (\(a,b) -> a < b) xs