Sorting F#值为'的记录排序顺序;尚未按顺序分配给类型

Sorting F#值为'的记录排序顺序;尚未按顺序分配给类型,sorting,f#,sequence,records,Sorting,F#,Sequence,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; r

我试图按照每条记录中的第二个元素对一系列记录进行排序。问题在于,它们不是一个值,而是一个类型。我有一个函数,它根据它的类型返回值

这就是我所拥有的:

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......
我想做的是按照等级作为一个值来排序

例如,现在的手是:{{红心;三个};{黑桃;杰克};{钻石;两个}

它将对手进行排序,结果是:{{钻石;两个};{红心;三个};{黑桃;杰克}

我尝试过使用hand |>Seq.sort |>Seq.groupBy id |>Seq.map snd,但这并没有按值排序,只按字母顺序排序

我不能更改任何类型,但我可以更改其他所有类型。
任何想法都将不胜感激,谢谢

您需要稍微清理一下代码,因为它显示记录,我将卡片类型重写为元组,并将匹配函数也重写为元组。然后,您只需通过管道进入
Seq.sortBy
Seq.sortByDescending
(按升序排序):

type套装=黑桃|梅花|红心|钻石
类型等级=王牌|二|三|四|五|六|七|八|九|十|杰克|女王|国王
类型卡=西装*等级
手动类型=卡片顺序
let cardValue(卡:卡)=
配牌
|_u,Ace->1
|两个->两个
|(三)->三
|四个->四个
|五,五->五
|(六)->六
|七点,七点->七点
|八点,八点->八点
|_uu9->9
|十,十,杰克,王后,国王->十
let hand=seq[(红桃,三颗);(黑桃,杰克);(钻石,两颗)]
hand |>Seq.sortBy cardValue
//val it:seq=
//顺序[(钻石,二);(红桃,三);(黑桃,杰克)]
有记录的版本: 我把这个和你原来的很接近

/// 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 
///有记录的版本
类型套装=黑桃|梅花|红心|钻石
类型等级=王牌|二|三|四|五|六|七|八|九|十|杰克|女王|国王
类型卡片={suit:suit;rank:rank}
手动类型=顺序
let cardValue(卡:卡)=
如果(card.rank=Ace),则1
elif(card.rank=2)则为2
elif(card.rank=3)则为3
elif(card.rank=4)则为4
elif(card.rank=5)则为5
elif(card.rank=6)则为6
elif(card.rank=7)则为7
elif(card.rank=8)则为8
elif(card.rank=9)则为9
elif(card.rank=10)则为10
elif(card.rank=Jack)然后10
elif(card.rank=Queen)然后10
elif(card.rank=King)然后是10
其他0
let hand=seq[{suit=Hearts;rank=Three};{suit=Spades;rank=Jack};{suit=Diamonds;rank=Two}]
hand |>Seq.sortBy cardValue
valit:seq=seq[{suit=Diamonds; 等级=二;};{suit=心; 等级=三;};{suit=黑桃; 秩=杰克;}]


您的序列不是元组而是记录。
hand |>Seq.sortBy cardValue
。?我还认为
Rank*Suit
更容易理解…我感谢您的帮助和解释,但不幸的是我无法更改类型卡。因此,当我尝试将卡片与值进行匹配时,它现在抱怨的不是类型“card”,而是“a*”b“,这不是真正的问题。您只需要最后一行:-)让我添加一个记录版本。你应该去掉元组标签,把问题重新表述一下。可以了,抱歉给你带来了困惑。我做F#的时间不长,我的术语也不是最好的哈哈。嗯,这并没有真正改变解决方案的逻辑,顺便说一句。我真的很感谢你的帮助和建议,现在我知道了这一点,我应该可以做剩下的事情了!
/// 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