我想检查比较运算符是对还是错

时间:2018-08-05 19:31:27

标签: sorting haskell

所以我知道如何编写代码来查看我的列表是从最小到最大排序

isSorted :: (Ord a) => [a] -> Bool
isSorted []       = True
isSorted [x]      = True
isSorted (x:y:xs) = x <= y && isSorted (y:xs)

但是我想编写一个代码,告诉我列表是否由给定的比较运算符排序 例如 我想输入

sorted (<=) [1,2,2,4,5] == True
sorted (<)  [1,2,2,4,5] == False
sorted (==) [1,2,2,2,3] == False

我该怎么办?

2 个答案:

答案 0 :(得分:5)

  

我想编写一个代码,告诉我列表是否由给定的比较运算符排序,例如我想输入

isSorted函数可以得到增强,以接收比较两个元素的函数,并且可以在您的示例中调用该函数而不是<=

isSorted :: (a -> a -> Bool) -> [a] -> Bool
isSorted _ []       = True
isSorted _ [x]      = True
isSorted comparator (x:y:xs) = comparator x y && isSorted comparator (y:xs)

因此该函数将被称为:

isSorted (<) [1, 2, 3]
isSorted (>=) [3, 2, 1]

如果列表中的元素相同,则用(==)进行调用只会比较。

答案 1 :(得分:1)

这个想法可以是参数化比较。现在您使用<=,但是我们可以将其替换为f,我们将其作为参数传递:

isSorted :: (a -> a -> Bool) -> [a] -> Bool
isSorted _ [] = True
isSorted _ [x] = True
isSorted f (x:y:xs) = f x y && isSorted f (y:xs)

但是,我们可以使用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]and :: [Bool] -> Bool改进以下代码:

isSorted :: (a -> a -> Bool) -> [a] -> Bool
isSorted _ [] = True
isSorted f xs@(_:xs2) = and(zipWith f xs xs2)

isSorted因此采用了一个可与两个a一起使用的谓词,并且我们检查该谓词是否适用于每个项目及其下一个项目。因此,您可以编写不必封装 order关系的更高级的谓词。