所以我知道如何编写代码来查看我的列表是从最小到最大排序
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
我该怎么办?
答案 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关系的更高级的谓词。