2011-08-27 73 views
3

我想學習一些模板哈斯克爾。作爲練習,我寫了一個函數,可以生成諸如isLeftisRight(受this question啓發)。這是我謙虛的嘗試:如何檢查模板Haskell中引用的數據構造函數名稱?

isA connam = do 
    ConE nam <- connam 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (conP nam [wildP]) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 

的問題是,它只有一個參數的構造函數工作。罪魁禍首是conP nam [wildP]模式。理想情況下,它應該看起來像conP nam (replicate (numArgs nam) wildP),其中numArgs是一個函數,返回構造函數的參數個數。但是,我怎麼寫這樣的功能呢?我想我需要訪問相關的數據聲明,但我不知道如何。

還有關於這個非常相同的功能here的另一個問題。

回答

7

雖然你可以使用reify和檢查類型來確定數據的構造函數的元數,它更容易使用記錄圖形生成元數無關代碼:

isFoo :: Bar -> Bool 
isFoo p = case p of 
    (Foo {}) -> True  -- Valid no matter what the arity of Foo is 
    _  -> False 

這可以通過更換conP完成與recP在您的代碼。

isA connam = do 
    ConE nam <- connam 
    nn <- newName "p" 
    lamE [varP nn] $ caseE (varE nn) [ 
         match (recP nam []) (normalB [| True |]) [], 
         match wildP (normalB [| False |]) [] 
        ] 
+0

謝謝,工作! –

相關問題