给出以下工作代码。
type Square =
{ Foo : int }
type Circle =
{ Bar : int }
type Shape =
| Square of Square
| Circle of Circle
let Test x =
match x with
| Square { Foo = f } ->
Circle { Bar = f + 1 }
| Circle { Bar = f } ->
Circle { Bar = f + 2 }
let a = Square { Foo = 1 }
let b = Test a
let c = Test b
函数Test具有预期的返回类型(Shape - > Shape)。 如果我然后稍微将Test的定义更改为......
let Test x =
match x with
| Square { Foo = f } ->
{ Bar = f + 1 }
| Circle { Bar = f } ->
{ Bar = f + 2 }
Test函数的签名更改为Shape - >圈和最后一行
let c = Test b
现在不编译。为什么测试的第二个定义不起作用? 为什么Test函数的签名会发生变化?
答案 0 :(得分:2)
当你定义这样的形状类型时:
type Shape =
| Square of Square
| Circle of Circle
它可能有点混乱,因为Circle
出现两次。
因此,在第一个版本中:
Circle { Bar = f + 1 }
实际上是一个形状。这很令人困惑,因为它几乎看起来像圆形类型的构造函数,特别是来自你有new X()
的C ++习语。
结果,
{ Bar = f + 1 }
实际上是一个圆圈,它解释了你得到的错误。