在哈斯克尔(Haskell)遇到麻烦



我具有此功能:

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

最新更新