我正在编写一个创建一副纸牌的 F# 教程。列出了类型,但我无法理解如何循环遍历类型来创建完整套牌的地图。我期望做类似的事情
Foreach rank in ranks
Foreach suit in suits
somehow combine the two
next suit
next rank
难道就没有办法了吗?以下是创建的类型。
我想如果我将它们从类型更改为列表,它们可以合并,对吧?那么,类型有什么意义呢?
type suits=
|Spade=1
|Heart=2
|Club=3
|Diamond=4
type ranks=
|ValCard of int
|Jack
|Queen
|King
type deck= Deck of ranks * suits
另一种方法是使用有区别的联合,它比枚举与 F# 语法的配合更好
type suit=
|Spade
|Heart
|Club
|Diamond
static member all = [Spade;Heart;Club;Diamond]
type rank=
|ValCard of int
|Jack
|Queen
|King
static member all =([1..10]|> List.map (ValCard)) @ [Jack;Queen;King]
type card = |Card of rank * suit
let all_cards = suit.All |> List.collect (fun s -> rank.all |> List.map (fun r -> Card(r,s))
然后你可以做一些简洁的模式匹配,比如
all_cards
|> List.iter (fun c ->
match c with
|Card(King,Spade) -> ...
|Card(King,_) -> ...
|Card(_) -> ...
您甚至可以定义一些活动模式来获得红/黑卡。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)