gpt4 book ai didi

f# - 如何在集合上使用模式匹配

转载 作者:行者123 更新时间:2023-12-01 04:40:55 24 4
gpt4 key购买 nike

我可以在集合上使用模式匹配吗?

我有一个代表井字棋盘的网格。

如何使用模式匹配来识别“X”或“O”的条纹?

到目前为止,我构建了一个这样的网格:

// ----------------
// 0 | 1 | 2 |
// ----------------
// 3 | 4 | 5 |
// ----------------
// 6 | 7 | 8 |
// ----------------

type Marker =
| X = 0
| O = 1
| NULL = 3

let cells = [0..8]
let grid = [for cell in cells -> (cell, Marker.NULL)]

let streakExists =
match grid with
| ???
| ???

所以我想使用模式匹配来识别像下面这样的条纹:

//如果grid.[..2]都有X

//或者grid.[3..5]都有X

//或者grid.[6..8]都有X

//返回真值

//--------------------

//如果grid.[0;3;6;]都有X

//或者grid.[1;4;5]都有X

//或者grid.[2;5;8]都有X

//返回真值

//--------------------

//如果grid.[0;4;8;]都有X

//返回真值

注意:

我正在学习 F# 的基础知识。因此,如果这个问题显得显而易见,请原谅我。

最佳答案

您可以在集合上使用模式匹配,但是有很多情况您必须在井字游戏中涵盖,因此它可能不是最佳选择。

如果我稍微简化您的代码(使用可区分联合而不是枚举,并仅使用可区分联合的值列表),它看起来像这样:

type Marker =
| X
| O
| NULL

let grid = [ for cell in 0 .. 8 -> NULL ]

let streakExists =
match grid with
| [X;X;X;_;_;_;_;_;_]
| [_;_;_;X;X;X;_;_;_]
| [_;_;_;_;_;_;X;X;X] -> "X wins"
| _ -> "Not sure"

这会奏效,但您可以看到涵盖所有情况有多么困难。如果我想解决同样的问题,我可能会用不同的方式来写。您可以创建一个列表列表来表示网格中所有可能的条纹:

let streaks = 
[ for row in [0;3;6] do // Generate one streak for each row
yield [row;row+1;row+2]
for col in [0;1;2] do // Generate one streak for each column
yield [col;col+3;col+6]
yield [0;4;8] // Explicitly add two
yield [2;4;6] ] // diagonal streaks

现在您可以通过测试是否有任何连胜(来自 streaks)来检查 grid 是否包含连胜,这样所有指定索引处的值都是 XO。使用 List.forallList.exists 应该很容易做到这一点。

关于f# - 如何在集合上使用模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33722988/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com