为什么未识别指定值上的模式匹配
当我尝试对名为target的值进行模式匹配时,我收到警告:
[<Test>]
let ``set center cell to alive``() =
// Setup
let target = (2,2)
let grid = createGrid 9 |> Map.map (fun k v ->
match k with
| target -> { v with Status=Alive }
| _ -> v)
// Test
let center = grid |> getStatus (2,2)
// Verify
center |> should equal Alive
Run Code Online (Sandbox Code Playgroud)
警告指向:
| target -> { v with Status=Alive }
| _ -> v)
Run Code Online (Sandbox Code Playgroud)
特别是:
| _ -> v)
Run Code Online (Sandbox Code Playgroud)
警告是:
永远不会达到这条规则.
这迫使我不使用目标而是硬编码值以解决警告:
[<Test>]
let ``set center cell to alive``() =
// Setup
let grid = createGrid 9 |> Map.map (fun k v ->
match k with
| (2,2) -> { v with Status=Alive }
| _ -> v)
// Test
let center = grid |> getStatus (2,2)
// Verify
center |> should equal Alive
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我不能这样做吗?
完整代码:
type Status = Alive | Dead
type Cell = { X:int; Y:int; Status:Status }
let isNeighbor cell1 cell2 =
let isAbsNeighbor v1 v2 =
match abs (v1 - v2) with
| 0 | 1 -> true
| _ -> false
let isValueNeighbor v1 v2 =
match v1 >= 0
&& v2 >= 0 with
| true -> isAbsNeighbor v1 v2
| _ -> isAbsNeighbor v2 v1
match cell1.X <> cell2.X
|| cell1.Y <> cell2.Y with
| true -> isValueNeighbor cell1.X cell2.X
&& isValueNeighbor cell1.Y cell2.Y
| _ -> false
let createGrid rowCount =
[for x in 1..rowCount do
for y in 1..rowCount do
yield { X=x; Y=y; Status=Dead } ]
|> List.map (fun c -> (c.X, c.Y), { X=c.X; Y=c.Y; Status=Dead })
|> Map.ofList
let getStatus coordinate (grid:Map<(int * int), Cell>) =
match grid.TryFind coordinate with
| Some cell -> cell.Status
| None -> Dead
Run Code Online (Sandbox Code Playgroud)
在match
表达式中,规则
match k with
| target -> { v with Status=Alive }
Run Code Online (Sandbox Code Playgroud)
无条件匹配并绑定k
到影响target
现有定义的名称.这意味着永远不会达到以下条款.您可以使用条件匹配:
match k with
| t when t = target -> { v with Status = Alive }
| _ -> v
Run Code Online (Sandbox Code Playgroud)