2012-12-21 59 views
7

目前我正在嘗試從Haskell子集進行翻譯,而不必處理所有解析,類型檢查等問題。文檔沒有幫助我找出一個函數來獲取函數的主體(所有定義)的名稱。如何使用模板Haskell獲取函數的主體?

背景下,此調用應該是這個樣子

fac 0 = 1 
fac x = z * fac (x - 1) 

getBody = ... 

main = do 
    x <- runQ $ getBody [| fac |] 
    print x 

有誰知道

  1. 是否有一些好的,爲什麼要在TH日期文檔(不Hackage參考)或
  2. 如何使getBody?
+1

你想在這裏用'runQ'做什麼?很確定,在運行時你無法獲得想要使用TH的信息。 –

回答

10

一般來說,用TH找到東西的定義的方法是使用reify函數。但是:

看起來你需要找到另一條路線。你有沒有考慮使用the haskell-src-exts package解析和/或GHC API或基於它的東西?

+0

是的,我們不能在運行時使用reify,但我們可以使用它返回的數據。它看起來像這樣(提到這個代碼由於GHC階段限制需要被分成兩個模塊;也可以在GHCi中運行): 'conv1(TyConI x)= [| TyConI $(conv2 x)|]' 'conv2(DataD _ name _ _ _)= [| DataD [](mkName $(return $ LitE $ stringL $ show name))[] [] [] |]' 'main = print $(reify''Int >> = conv1)' 此外,'reify'無論如何,都會爲函數的_call_返回AST,但不是它的正文。應該有reifyDecl函數,這是真的不存在。 我很感激你的幫助。謝謝。 –

+0

@ polkovnikov.ph:在名稱上使用'reify'通常會給你聲明,當它有意義時 - 對於一個類型,它會給你構造函數列表,派生列表等等。 '''''''''''''''一個函數的名字的具體化爲你提供了一個'VarI'來表示信息,它有一個'Maybe Dec'值,即一個聲明。如果我明白你想要什麼,'reify'就可以做到,它現在還沒有實現,因爲很少有人想要它。 –

+0

對於任何可能閱讀此內容的人:我很有興趣在不久的將來開展此功能。我真的可以使用它。 – jtobin