为什么未识别指定值上的模式匹配

Sco*_*rod 2 f#

为什么未识别指定值上的模式匹配

当我尝试对名为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)

Lee*_*Lee 8

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)