我有一张卡片数据类型:
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
答案 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]