如何复制受歧视的工会案例值?

Sco*_*rod 1 f#

如何复制受歧视的工会案例值?

以下代码有一些重复:

let move (direction:Direction) (checker:Checker) =
    match checker with
    | Red   xy -> Red   { xy with X=2; Y=2 }
    | Black xy -> Black { xy with X=2; Y=2 }
Run Code Online (Sandbox Code Playgroud)

具体来说,我不想仅仅为了设置其记录值来指定检查器的类型.因此,我不在乎检查器是红色还是黑色.我想复制检查器案例值并更新其位置.

我宁愿做这样的事情:

let move (direction:Direction) (checker:Checker) =
    match checker with
    | _ xy -> _ { xy with X=2; Y=2 }
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

[<Test>]
let ``move checker``() =
    Black { X=1; Y=1 } |> move NorthEast 
                       |> should equal (Black { X=2; Y=2 })
Run Code Online (Sandbox Code Playgroud)

附录:

module Test3

open NUnit.Framework
open FsUnit

type Position = { X:int; Y:int }
type Checker = | Red of Position | Black of Position

type Direction =
    | NorthEast
    | NorthWest
    | SouthEast
    | SouthWest

(* Functions *)
let move (direction:Direction) (checker:Checker) =
    match checker with
    | Red   xy -> Red   { xy with X=2; Y=2 }
    | Black xy -> Black { xy with X=2; Y=2 }

[<Test>]
let ``move checker``() =
    Black { X=1; Y=1 } |> move NorthEast 
                       |> should equal (Black { X=2; Y=2 })
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 6

你要求的东西不能在没有反射技巧的F#中完成.

这里有一个常识性的解释:联合案例在其下面具有完全相同的数据是非常罕见的.在这种情况下,它可能表明联合案例本身只是用于标记数据的"标签",因此应该与数据"并排"编码,而不是"围绕"它.由于这种联合类型是罕见的例外,因此发明语言机制来支持它们是没有意义的.

这种合理化很好地适用于您的特定情况:检查器的颜色是"标签",应该"位于"位置,而不是"包裹"它.如果将检查器定义为{ pos: Position; color: Color },则可以在不触及颜色的情况下更新位置.