我正在研究一個簡單的編譯器。它從一個遞歸的複雜數據結構開始(即它是一個表達式樹),並以完全相同的數據結構結束,但不允許遞歸。打開和關閉開關類型遞歸
「沒問題」,我想我自己,「我只是讓遞歸類型成爲一個類型參數,然後爲遞歸和非遞歸類型定義類型同義詞」。
......嗯,是的,但事實證明,你不能這樣做。你看,類型同義詞不允許遞歸。 > facepalm <
任何想法如何我可以實現我後?
下面是一個非常簡單的例子。假設我有這兩個數據類型:
data Type1 = Foo ID | Bar [Type1] | Baz Type1 Type1
data Type2 = Foo ID | Bar [ID] | Baz ID ID
我的計劃是簡單地做到這一點:
data Type r = Foo ID | Bar [r] | Baz r r
type Type1 = Type Type1
type Type2 = Type ID
但顯然這並不實際工作。
目前,看來我的選擇是這些:
- 忽略的問題,不要試圖在一個類型系統來強制實施此限制。
- 複製整個類型定義(包括重命名所有構造函數)。
這些都不是真的令人滿意。對於上面這個簡單的例子,複製類型並不算太壞;對於大類型定義,你不想這樣做!
我曾希望避免數百個包裝和解包操作,但似乎沒有其他辦法。 :-S – MathematicalOrchid
@MathematicalOrchid:我會使用模式同義詞來幫助解決這個問題。 –