F#:从函数返回联合类型

时间:2016-09-23 00:32:05

标签: f#

给出以下工作代码。

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函数的签名会发生变化?

1 个答案:

答案 0 :(得分:2)

当你定义这样的形状类型时:

type Shape =
    | Square of Square
    | Circle of Circle

它可能有点混乱,因为Circle出现两次。

因此,在第一个版本中:

Circle { Bar = f + 1 }

实际上是一个形状。这很令人困惑,因为它几乎看起来像圆形类型的构造函数,特别是来自你有new X()的C ++习语。

结果,

{ Bar = f + 1 }

实际上是一个圆圈,它解释了你得到的错误。