【发布时间】:2018-05-12 04:53:38
【问题描述】:
因此,作为一项学校作业,我必须编写一个识别扑克手的部分主动模式,例如:
let (|FullHouse|_|) (x: (string * string) list) =
x
|> List.groupBy snd
|> List.sortByDescending fst
|> List.forall (fun (_, v) -> v |> List.length > 1)
|> function true -> Some () | _ -> None
let x6 =
match [("S", "2"); ("S", "2"); ("S", "Q"); ("S", "Q"); ("S", "Q")] with
| FullHouse -> sprintf "Full house"
| _ -> "Nothing"
我已经成功完成了 9 手牌中的 6 手,但我不知道如何检查手牌中是否有顺子(5 个值是连续的,例如 3、4、5、6、 7)。有没有清单。哪位操作员可以帮我做这件事?
【问题讨论】:
-
这个问题与活动模式无关。这可能是一个简单的功能,你会遇到同样的问题。能够将问题拆分成更小的部分非常有用,这样您就可以提出更具体和相关的问题。
-
尝试编写一个函数,它只接收卡片值的列表,并检查它们是否连续且唯一。一旦你测试了它自己的工作,你应该能够在你当前的实现中使用它。提示:当你做
List.groupBy snd时,你是按卡值分组,而不是花色。这似乎不对。 -
我明白这一点,但即使在单独的函数中我也无法做到这一点,因为正如你所说,它仍然是同样的问题。
-
您可能想要对列表进行排序,然后使用
List.pairwise将卡片分成对。 (pairwise函数将[1; 2; 3; 4]变成[(1,2); (2,3); (3,4)])。然后寻找一个属性 P,当且仅当这手牌是顺子时,它对每对这样的牌都为真。一旦你弄清楚了这个属性 P 可能是什么,你就可以编写一个函数来检查它,并在该对列表上使用List.forall。 -
List.pairwise 可用于检查每个项目是否连续。您可能还需要一个自定义排序功能 - 将图片卡放在正确的位置。
标签: f# functional-programming f#-interactive