F# 排序记录序列,其中值尚未分配给序列中的类型
F# Sorting Sequence of Records where Value isn't yet assigned to Type in Sequence
我正在尝试按每条记录中的第二个元素对记录序列进行排序。问题是这些不是一个值,而只是一个类型。我有一个函数,它 returns 基于类型的值。
这是我的:
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......
我想做的是按等级作为值对手牌进行排序。
例如手牌目前是:{{Hearts;三}; {黑桃;杰克}; {钻石;两个}}
它将对 Hand 进行排序,因此结果是:{{Diamonds;二}; {红心;三}; {黑桃;杰克}}
我试过 hand |> Seq.sort |>Seq.groupBy id |> Seq.map snd 但这不是按值排序,而是按字母顺序排序。
我无法更改任何类型,但我可以更改其他所有类型。
任何想法将不胜感激,谢谢!
您需要稍微清理一下显示记录的代码,我将 Card 类型重写为元组和匹配函数。然后你需要做的就是通过管道输入 Seq.sortBy
或 Seq.sortByDescending
(按升序排序):
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 it : seq = seq [{suit = Diamonds;
rank = Two;}; {suit = Hearts;
rank = Three;}; {suit = Spades;
rank = Jack;}]
我正在尝试按每条记录中的第二个元素对记录序列进行排序。问题是这些不是一个值,而只是一个类型。我有一个函数,它 returns 基于类型的值。
这是我的:
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......
我想做的是按等级作为值对手牌进行排序。
例如手牌目前是:{{Hearts;三}; {黑桃;杰克}; {钻石;两个}}
它将对 Hand 进行排序,因此结果是:{{Diamonds;二}; {红心;三}; {黑桃;杰克}}
我试过 hand |> Seq.sort |>Seq.groupBy id |> Seq.map snd 但这不是按值排序,而是按字母顺序排序。
我无法更改任何类型,但我可以更改其他所有类型。 任何想法将不胜感激,谢谢!
您需要稍微清理一下显示记录的代码,我将 Card 类型重写为元组和匹配函数。然后你需要做的就是通过管道输入 Seq.sortBy
或 Seq.sortByDescending
(按升序排序):
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 it : seq = seq [{suit = Diamonds; rank = Two;}; {suit = Hearts; rank = Three;}; {suit = Spades; rank = Jack;}]