在Haskell中遇到元组问题

时间:2014-01-19 18:44:05

标签: list haskell tuples

我有这个功能:

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]

为什么这是错的?

2 个答案:

答案 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