2015-08-24 16 views
10

所以我想要一個表示包含一組節點類型的樹的類型。我還希望表示在重疊集上定義的類似樹。這是Typed AST問題的另一個版本。再說說我的節點類型的池:如何在Haskell中標記多態樹時減少語法混亂?

data Lit = Lit Int 
data Var = Var String 
data Hole = Hole Int 

解析樹可以包含Lit S或Var秒,但沒有Hole秒。稱爲模板的第二種樹可以包含Lit s,Var s或Hole s。

爲了簡單起見,有一種稱爲Add的遞歸節點。

data Parse = A Lit | B Var 
data Template = C Lit | D Var | E Hole 
data Tree a = Leaf a 
      | Add (Tree a) (Tree a) 

所以,現在我可以宣佈的數據,我仍然可以在其模式匹配,唯一的問題是語法混亂。

aParse = Add (A Lit 3) (B Var "x") 
aTemplate = Add (C Lit 4) (E Hole 3) 
fun (Add (A lit) (B var) = ... 

我想是一些糖類似於:

ParseLit = A . Lit 
TempLit = C . Lit 

顯然別名,構造函數(不是類型)的組成不合法的哈斯克爾。但是寫這個最簡潔的方法是什麼,避免儘可能多的鍋爐板?

回答

14

PatternSynonyms語言擴展可以在這裏幫助。它允許您指定模式的別名:

{-# LANGUAGE PatternSynonyms #-} 

pattern ParseLit x = A (Lit x) 

someFunc :: Parse -> Int 
someFunc p = case p of 
    ParseLit x -> x 
    _ -> 0 

有兩種風格的模式同義詞:雙向(如示例中)和單向。雙向的也可以用作構造函數:

*Main> :t ParseLit 
ParseLit :: Int -> Parse 

*Main> ParseLit 77 
+0

哦哇。這正是我所期待的。謝謝。 – Amoss