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