【问题标题】:Why doesn't pattern matching on a property of a record compile?为什么不编译记录属性上的模式匹配?
【发布时间】:2025-11-25 13:55:02
【问题描述】:

为什么不编译记录属性的模式匹配?

type Cell = { X:int; Y:int }

let isNeighbor cell1 cell2 =
    match cell1.X, cell2.X with
    | cell1, cell2 when cell1.X <> cell2.X 
                    ||  cell1.Y <> cell2.Y -> let xAligned = IsValueNeighbor cell1.X cell2.X
                                              let yAligned = IsValueNeighbor cell1.Y cell2.Y

                                              xAligned && yAligned
    | _ -> false

错误:

“int”类型与“Cell”类型不兼容

以下表达式似乎有问题:

    cell1.X <> cell2.X 
||  cell1.Y <> cell2.Y

【问题讨论】:

    标签: f# pattern-matching


    【解决方案1】:

    当你这样做时

    match cell1.X, cell2.X with
    | cell1, cell2
    

    您创建了一个新的cell1 变量,即cell1.X(一个int)。

    我可能会在这里使用 if,或者更改为 | _,_ when ...

    【讨论】:

      【解决方案2】:

      正如 John Palmer 已经解释的那样,您正在遮蔽原始参数。如果模式匹配感觉不太适合 if-elif-else 可能会更好。如果您想使用模式匹配,以下可能会有所帮助:

      let isNeighbor { X=x1; Y=y1 } { X=x2; Y=y2} =
          match abs(x1-x2), abs(y1-y2) with
          | 0,1 | 1,0 | 1,1 -> true
          | _ -> false
      

      如果对角相邻单元格不应该是邻居,请删除1,1 模式。然后,还有欧式距离……

      【讨论】:

        最近更新 更多