2017-04-17 50 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