我正在尝试创建一个对Person列表进行排序的函数(它是(Name,Date)的元组,其中date是表单DD,MM,YYYY中的(Int,Int,Int)元组)按日期。
我做了以下事情:
我做了一些函数getThrd,getSnd和getFst,分别从元组中提取年,月和日值。然后我使用quicksort按年份排序列表。
quickSortYear :: [Person] -> [Person]
quickSortYear [] = []
quickSortYear (x:xs) = quickSortYear [y |y<-xs, (getThrd y)>(getThrd x)]++[x]++[y|y<-xs, (getThrd y)<=(getThrd x)]
然后我创建了sortMonth和sortDay函数,它们按照按年排序的列表排序,按月和日排序,一个接一个地排序,就像在最后的sortNameList函数中一样。
sortMonth :: [Person] -> [Person]
sortMonth (x:y:xs)
|(getThrd x)==(getThrd y) && (getSnd x)>(getSnd y) = x : sortMonth (y:xs)
|(getThrd x)==(getThrd y) && (getSnd x)<(getSnd y) = y : sortMonth (x:xs)
|(getThrd x)==(getThrd y) && (getSnd x)==(getSnd y) = x : y : sortMonth (xs)
|(getThrd x)/=(getThrd y) = x : y : (sortMonth xs)
sortDay :: [Person] -> [Person]
sortDay (x:y:xs)
|(getThrd x)==(getThrd y) && (getSnd x)==(getSnd y) && (getFst x)>(getSnd y) = x : sortDay (y:xs)
|(getThrd x)==(getThrd y) && (getSnd x)==(getSnd y) && (getFst x)<(getSnd y) = y : sortDay (x:xs)
|(getThrd x)==(getThrd y) && (getSnd x)==(getSnd y) && (getFst x)==(getSnd y) = x : y : sortDay (xs)
|(getThrd x)/=(getThrd y) || (getSnd x)/=(getSnd y) = x : y : (sortDay xs)
sortNameList :: [Person] -> [Person]
sortNameList (x:xs) = sortDay(sortMonth(quickSortYear (x:xs)))
我们的想法是让sortNameList按年排序,然后让sortMonth运行在排序列表上并按月对其进行排序,然后让sortDay运行排序列表并对其进行排序。
我没有解析错误。 但是当我用列表测试它时,它表示该模式在sortMonth中并非详尽无遗。
当我自己测试sortMonth和sortDay时,两者都给出了非详尽的模式错误。
我多次看了我的代码而且我不明白它为什么不能工作。 有人可以帮忙吗?
答案 0 :(得分:4)
如果您向sortDay
或sortMonth
提供包含一个元素或不包含元素的列表,会发生什么?您的模式(x:y:xs)
仅匹配至少包含两个元素的列表。
话虽这么说,你现在的代码有点麻烦,不是吗?尝试编写以下函数:
quickSortBy :: (a -> a -> Ordering) -> [a] -> [a]
然后,您可以轻松地表达sortMonth
和sortDay
。请注意,quickSortBy
中的sortBy
已作为Data.List
存在,因此如果您设法编写quickSortBy
,请使用该{。}}。