2016-09-23 61 views
2

給定以下工作代碼。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具有預期的返回類型(形狀 - >形狀)。 如果我再改試驗的定義略有...

let Test x = 
    match x with 
    | Square { Foo = f } -> 
     { Bar = f + 1 } 
    | Circle { Bar = f } -> 
     { Bar = f + 2 } 

的測試功能變化的簽名形狀 - >圈和最後一行

let c = Test b 

現在不能編譯。爲什麼Test的第二個定義不起作用? 爲什麼測試功能的簽名改變?

+2

因爲形狀不是圓形 –

+0

爲了響應編輯'{Bar = f + 1}'是一個圓形,而不是形狀。 –

+0

它在工作定義中不是一個圓圈嗎? – Craig

回答

2

當你定義形狀類型是這樣的:

type Shape = 
    | Square of Square 
    | Circle of Circle 

它可以是一個有點混亂,因爲Circle出現了兩次。

其結果是,在第一個版本:

Circle { Bar = f + 1 } 

實際上是一個形狀。這是令人困惑的,因爲它幾乎看起來像是一個圈類型的構造函數,特別是你有new X()的C++習慣用法。

結果,

{ Bar = f + 1 } 

實際上是一個圈,這也解釋了你所得到的錯誤。