在快速排序中包含其他功能

时间:2014-12-11 18:48:23

标签: haskell quicksort

发生以下问题:我正在尝试实现quickSort函数,该函数对[(Name,(Day,Month,Year)]形式的元组列表进行排序。我编写了函数tupleTurndateTurn,它们生成了以下元组((Year,Month,Day),Name)

type firstname = String
type lastname = String
type day = String
type month = String
type year =  String
type name = (lastname,firstname)
type date = (day,month,year)
type person = (name, date)

tupleTurn :: (name,date)->(date,name)
tupleTurn (a,b) = (b,a) 

dateTurn :: ((day,month,year),name) ->(year,month,day),name)
dateTurn ((a,b,c),x) = ((c,b,a),x)

它们都可以一个接一个地完美地运行,以获得所需的元组列表。最后,我想通过quicksort对这个更改的列表进行排序。所以我实施了:

quickSortDate :: Ord a => [a] -> [a]
quickSortDate [] =[]
quickSortDate (x:xs) = quickSort ([y |y<- xs,y<=x]) ++ [x] ++ quickSort([y |y<- xs,y>x])
    where x = dateTurn (tupleTurn x); xs = dateTurn (tupleTurn xs)

错误消息:

datelist.hs:42:22:Couldn't match 
    expected type ‘[(Name, Datum)]’ 
    with actual type ‘(t0, t1)’
In the pattern: (xs, ys)
In the pattern: (x, y) : (xs, ys)
In an equation for ‘tupleTurnList’: 
    tupleTurnList ((x, y) : (xs, ys))= [tupleTurn (x, y) :: tupleTurn (xs, ys)]

我想问题是它试图将xs放入函数中的部分,还是?

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误。我列举一些。

首先,请注意这是一个递归定义!

where x = dateTurn (tupleTurn x)

只要您评估x,您的代码就会挂在这个等式中,或者如果您幸运的话,GHC会检测到循环,并会以<<loop>>例外停止您的程序。

你可能想要像

这样的东西
where x2 = dateTurn (tupleTurn x)

然后

xs = dateTurn (tupleTurn xs)
由于同样的原因,

不起作用。此外,xs是一个列表,tupleTurn需要单个元素,从而导致类型错误。

此外,您正尝试在quickSortDate内交换列表。但是,通过执行此操作,您没有意识到它们将在每次quickSortDate递归调用时进行交换。这看起来非常错误。

另一个错误:定义的类型必须以大写字母开头,例如type Name = ...

现在可能还有其他错误。

我的建议:写一个标准快速排序。然后定义您自己的<=运算符,例如

lessThanOrEqual :: Person -> Person -> Bool
lessThanOrEqual (name1,(d1,m1,y1)) (name2,(d2,m2,y2)) = ...

然后将x <= y中的quickSortDate比较更改为lessThanOrEqual x y