其他人建議的解決方法,但我建議你不要你想你的方式A(A(A(A(A(0)))))
,並A(A(A(A(B(0)))))
(語言試圖強迫你)是一個更好的選擇。
讓我們來看看你的樹型。您有兩種不同的東西:包含其他樹節點的樹節點或包含數據的樹節點。你要做的是用相同的名稱呼叫這兩樣東西:
type test =
| A of int
| A of test
這些名稱不是特別具有描述性。讓它們重命名爲
type Tree =
| Node of int
| Node of Tree
現在,當你通過你的樹結構的工作,你需要從案「樹節點」除了告訴「INT的節點」的情況:如果這是一個「節點的int「,你會想要(比如說)提取int並在計算中使用它。但是如果它是一個「樹的節點」,你會想要(比如說)進一步深入樹形結構,最終到達彩虹末端的金罐......我的意思是,在結束時的int樹。
所以,你需要寫一個match
結構類似如下:
let rec diveTree calculation node =
match node with
| Node a -> match a with
| :? int -> calculation a
| :? Tree -> diveTree calculation a
但是,如果我們做了什麼F#是試圖迫使你做,並用不同名稱爲「包含一個int」和「包含另一個樹」的情況?然後你的類型將是這樣的:
type Tree =
| LeafNode of int
| TreeNode of Tree
而且match
結構會是什麼樣子:
let rec diveTree calculation node =
match node with
| LeafNode a -> calculation a
| TreeNode a -> diveTree calculation a
我想你會發現後者更容易閱讀和理解前者。而即是爲什麼F#要求您爲歧視聯盟的不同情況使用不同的標籤。
另一種方法是'type test = A test option' –