2017-04-17 23 views
1

我想按每条记录中的第二个元素对记录序列进行排序。问题是这些不是一个值,而只是一个类型。我有一个函数返回基于哪个类型的值。F#对尚未分配值的记录排序序列

这是我有:

type Suit = Spades | Clubs | Hearts | Diamonds 
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King 
type Card = { suit: Suit; rank: Rank} 

type Hand = Card seq 

let cardValue(card:Card) = 
    if (card.rank = Ace) then 1 
    elif (card.rank = Two) then 2 
    elif (card.rank = Three) then 3 
    elif (card.rank = Four) then 4 
    elif (card.rank = Five) then 5 
    elif (card.rank = Six) then 6 
    elif (card.rank = Seven) then 7 
    elif (card.rank = Eight) then 8 
    elif (card.rank = Nine) then 9 
    elif (card.rank = Ten) then 10 
    elif (card.rank = Jack) then 10 
    elif (card.rank = Queen) then 10 
    elif (card.rank = King) then 10 
    else 0 

let sortHandByValue(hand:Hand) = 
......missing code here...... 

和我所试图做的是手工排序由排名作为一种价值。

因此,例如手是目前:{{心;三}; {黑桃;插口}; {钻石;两个}}

它将排序手,结果是:{{Diamonds;二}; {心;三}; {黑桃;杰克}}

我试过手|> Seq.sort |> Seq.groupBy id |> Seq.map snd但它不按值排序,只按字母顺序排列。

我不能改变任何类型,但我可以改变一切。 任何想法将不胜感激,谢谢!

+0

你的序列不是元组而是记录。 – s952163

+1

'hand |> Seq.sortBy cardValue' ..? – ildjarn

+0

我也觉得'秩* Suit'是容易消化... – s952163

回答

2

您需要清理代码,因为它显示记录,我将卡类型重写为一个元组以及匹配函数。然后,你需要的只是要管到Seq.sortBySeq.sortByDescending(如sortby升序排序):

type Suit = Spades | Clubs | Hearts | Diamonds 
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King 
type Card = Suit * Rank 

type Hand = Card seq 

let cardValue (card:Card) = 
    match card with 
    | _, Ace -> 1 
    | _, Two -> 2 
    | _, Three -> 3 
    | _, Four -> 4 
    | _, Five -> 5 
    | _, Six -> 6 
    | _, Seven -> 7 
    | _, Eight -> 8 
    | _, Nine -> 9 
    | _, Ten | _, Jack | _, Queen | _, King -> 10 


let hand = seq [(Hearts, Three); (Spades, Jack); (Diamonds, Two)] 

hand |> Seq.sortBy cardValue 
//val it : seq<Suit * Rank> = 
//seq [(Diamonds, Two); (Hearts, Three); (Spades, Jack)] 

版本与记录: 我一直在这个接近原件。

/// Version with Records 
type Suit = Spades | Clubs | Hearts | Diamonds 
type Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King 
type Card = { suit: Suit; rank: Rank} 
type Hand = seq<Card> 

let cardValue(card:Card) = 
    if (card.rank = Ace) then 1 
    elif (card.rank = Two) then 2 
    elif (card.rank = Three) then 3 
    elif (card.rank = Four) then 4 
    elif (card.rank = Five) then 5 
    elif (card.rank = Six) then 6 
    elif (card.rank = Seven) then 7 
    elif (card.rank = Eight) then 8 
    elif (card.rank = Nine) then 9 
    elif (card.rank = Ten) then 10 
    elif (card.rank = Jack) then 10 
    elif (card.rank = Queen) then 10 
    elif (card.rank = King) then 10 
    else 0 

let hand = seq [{suit=Hearts; rank=Three}; {suit=Spades;rank=Jack}; {suit=Diamonds;rank= Two}] 

hand |> Seq.sortBy cardValue 

VAL它:SEQ = SEQ [{西装=钻石; rank = Two;}; {适合=心; rank = Three;}; {suit =黑桃; rank = Jack;}]

+1

我很欣赏的帮助和解释,但遗憾的是我不能改变卡的类型。所以,当我尝试和匹配卡的价值观,它现在抱怨没有键入“卡”,是不是'A * B' – TJ8

+0

这是不是一个真正的问题。所有你需要的是最后一行:-)让我添加一个记录版本。你应该删除元组标签,并重新修改这个问题。 – s952163

+0

会做,抱歉的混乱。我没有做F#很长时间,我的术语不是最好的哈哈。 – TJ8