我正在嘗試創建一對相互遞歸的數據類型來表示OCaml中用於作業分配的紅黑樹。但是,我對OCaml語言非常不熟悉,所以我有一些語法問題。相互遞歸數據類型
這裏就是我來了這麼遠:
type 'a red_black_tree =
| RedNode of 'a * ('a black_node * 'a black_node)
| BlackNode of 'a black_node
and 'a black_node =
| TwoRedNodes of 'a * ('a RedNode * 'a RedNode)
| TwoBlackNodes of 'a * ('a black_node * 'a black_node)
| BlackLeaf;;
當我輸入到這一點的OCaml它給了我:
utop # type 'a red_black_tree =
| RedNode of 'a * ('a black_node * 'a black_node)
| BlackNode of 'a black_node
and 'a black_node =
| TwoRedNodes of 'a * ('a RedNode * 'a RedNode)
| TwoBlackNodes of 'a * ('a black_node * 'a black_node)
| BlackLeaf;;
Error: Syntax error
您不能引用類型的子值從一個子類?沒有尋找問題的實際答案,只是語法澄清。
UPDATE
我有這個最初的嘗試之後,但它是由教授說,這是不是一個對相互遞歸的數據類型的:
type 'a red_black_tree =
| RedNode of 'a red_node
| BlackNode of 'a black_node
and 'a red_node =
| RedTree of 'a * ('a black_node * 'a black_node)
and 'a black_node =
| TwoRedNodes of 'a * ('a red_node * 'a red_node)
| TwoBlackNodes of 'a * ('a black_node * 'a black_node)
| BlackLeaf;;
更新2
問題3 紅黑樹是一種有時用來組織數值數據的樹。它有兩種類型的節點,黑節點和紅節點。紅色節點總是有一個數據和兩個孩子,每個孩子都是一個黑色節點。黑色節點可能有:1)一塊數據和兩個子節點是紅色節點; 2)一個數據和兩個黑人節點的孩子;或3)沒有數據和沒有孩子(即葉節點)。 (這不是紅黑樹的精確描述,但是適用於此練習。)
編寫一對相互遞歸的OCaml數據類型,它們表示紅黑樹中的紅色節點和黑色節點。數據應該能夠具有任何類型,也就是說,您的類型應該是存儲在樹中的數據類型中的多態。
我更新我的帖子有這樣的一個例子。然而,當我提出來的教授,她說,這是不是一個對遞歸類型 – dmcqu314
的例子也許她是挑剔的,它不是一對,但特里普爾? ;)你可以指出她的事實,'red_node'取決於'black_node','black_node'取決於'red_node'。它不是相互遞歸嗎? – ivg
有時教授可能會非常嚴格。我也會發布該問題的描述。最糟糕的情況下,我會交出我得到的,因爲它只有5/200點的任務。 – dmcqu314