我具有此功能:
pairs :: [a] -> [(a,a)]
pairs xs = zip xs (tail xs)
,我必须基于对编写另一个,如果至少一对元组为上升顺序(例如(2,3))。
这是我对此的尝试:
unsorted :: Ord a => [a] -> Bool
unsorted xs = [if fst x < snd x then True else False| x <- pairs xs]
为什么这是错误的?
您的功能返回Bool
s的列表,而不是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
查看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