发生以下问题:我正在尝试实现quickSort
函数,该函数对[(Name,(Day,Month,Year)]
形式的元组列表进行排序。我编写了函数tupleTurn
和dateTurn
,它们生成了以下元组((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
放入函数中的部分,还是?
答案 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
。