按日期对记录进行排序,表示为元组

时间:2014-12-14 15:37:30

标签: haskell quicksort

我正在尝试创建一个对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时,两者都给出了非详尽的模式错误。

我多次看了我的代码而且我不明白它为什么不能工作。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

如果您向sortDaysortMonth提供包含一个元素或不包含元素的列表,会发生什么?您的模式(x:y:xs)仅匹配至少包含两个元素的列表。

话虽这么说,你现在的代码有点麻烦,不是吗?尝试编写以下函数:

quickSortBy :: (a -> a -> Ordering) -> [a] -> [a]

然后,您可以轻松地表达sortMonthsortDay。请注意,quickSortBy中的sortBy已作为Data.List存在,因此如果您设法编写quickSortBy,请使用该{。}}。