区別されたユニオンの大文字小文字の値をコピーするにはどうすればよいですか?区別されたユニオンの大文字小文字の値をコピーするにはどうすればよいですか?
次のコードは、いくつかの重複があります。
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 }
を具体的に、私はちょうどそのレコードの値を設定するためにチェッカーの種類を指定する必要はありません。したがって、チェッカーが赤か黒かどうかは気にしません。チェッカーケースの値をコピーしてその位置を更新するだけです。私はむしろどうなる
このような何か:
let move (direction:Direction) (checker:Checker) =
match checker with
| _ xy -> _ { xy with X=2; Y=2 }
は、ここに私のテストです:
[<Test>]
let ``move checker``() =
Black { X=1; Y=1 } |> move NorthEast
|> should equal (Black { X=2; Y=2 })
付録:
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 })
あなたのデータタイプたとえば、あなたはあなたの例それぞれの位置を更新する方法を知っているあなたのユニオン型で定義された、特殊なマップ機能を持たせることができます内側にあります。これがあなたのユースケースであれば、チェッカーを '{pos:Position; color:Color} 'を選択すると、色に触れずに位置を更新できます。 –
ああ...意味があります。ところで、私の設計上の問題にかかわらず、組合のケース値はコピーできますか? –