如何指定与另一种类型共享类型定义的类型?

如何指定与另一种类型共享类型定义的类型?

问题描述:

如何指定与另一种类型共享类型定义的类型?如何指定与另一种类型共享类型定义的类型?

下面的代码无法编译:

[<Test>] 
let ``move checker``() = 
    { Position={ X=1; Y=1 } } |> moveBlack NorthEast 
           |> should equal { Position={ X=2; Y=2 } } 

这是因为我传递到moveBlack功能记录被映射到RedChecker而不是BlackChecker。

类型不匹配。期待 RedChecker - >“一个,但给定一个 BlackChecker - > BlackChecker类型‘RedChecker’不匹配类型‘BlackChecker’

更可能的,出现此错误的原因是最后一类有这定义是RedChecker:

type BlackChecker = { Position:Position } 
type RedChecker = { Position:Position } 

我想我可以做这个指定的黑色方格:

(BlackChecker:{ Position={ X=1; Y=1 } }) 

,从而有:

[<Test>] 
let ``move checker``() = 
    (BlackChecker:{ { Position={ X=1; Y=1 } }) |> moveBlack NorthEast 
           |> should equal (BlackChecker:{ { Position={ X=2; Y=2 } }) 

然而,上面的代码也不会编译。

这里是我的代码的其余部分:

(* Types *) 
type Color = | Red | Black 

type North = NorthEast | NorthWest 
type South = SouthEast | SouthWest 

type Position =  { X:int; Y:int } 
type BlackChecker = { Position:Position } 
type RedChecker = { Position:Position } 

(* Functions *) 
let moveBlack (direction:North) (checker:BlackChecker) = 
    match direction with 
    | NorthEast -> { checker with Position= { X=2; Y=2 } } 
    | NorthWest -> { checker with Position= { X=1; Y=2 } } 

(* Tests *) 
[<Test>] 
let ``move checker``() = 
    { Position={ X=1; Y=1 } } |> moveBlack NorthEast 
           |> should equal { Position={ X=2; Y=2 } } 
+1

的可能的复制[F#记录:字段名称相同( http://stackoverflow.com/questions/5231355/f-records-fields-with-identical-names) – ildjarn

+0

我认为你甚至会寻找类似这样的事实可能会指出你的类型定义存在问题。为什么'BlackChecker'和'RedChecker'而不是'Checker'和另外一个'Color'字段?除了颜色之外,它们在功能上是相同的,不是吗? – TeaDrivenDev

The labels of the most recently declared type take precedence over those of the previously declared type.你应该能够做到这一点是这样的:

({ BlackChecker.Position={ X=1; Y=1 } })