排序卡片列表

时间:2018-10-15 06:39:11

标签: haskell

我有一张卡片数据类型:

data Card = Card Rank
   deriving (Ord)

我可以在其中用以下数组创建编号卡:

mycard = [Card 1,Card 7, Card 3]

我现在正尝试根据卡片的降序对卡片进行排序,尤其是使用快速排序。因此,我会得到

[Card 7, Card 3, Card 1]

我写道:

quicksort :: [Card] -> [Card]  
quicksort [] = []  
quicksort (x:xs) =   
    let smallerSorted = quicksort [a | a <- xs, a <= x !! 1]  #compare at index 1 which is the rank
        biggerSorted = quicksort [a | a <- xs, a > x !! 1] #compare at index 1 which is the rank 
    in  smallerSorted ++ [x] ++ biggerSorted 

但是我说错了

Couldn't match expected type ‘[Card]’ with actual type ‘Card’
• In the first argument of ‘(!!)’, namely ‘x’
  In the second argument of ‘(>)’, namely ‘x !! 1’
  In the expression: a > x !! 1

2 个答案:

答案 0 :(得分:3)

x是一张卡片,您正尝试使用x !! 1对其编制索引。 !!的第一个参数必须是列表([Card]),但是您提供了Card,因此出现了错误。

我认为您应该只与x进行比较。

答案 1 :(得分:1)

该错误表明您正在尝试对!!执行列表索引(Card),而Card不是列表。

您似乎正在尝试使用!!Card中提取等级,可能是假设Card是索引0,而Rank索引1.
那不是您可以做的,也不是任何事情的工作方式。

既然您导出了Ord,就可以简单地比较两个Card

[a | a <- xs, a <= x]

如果您没有派生Ord,则可以定义自己的“提取器”:

rank (Card r) = r

...

[a | a <- xs, rank a <= rank x]