2011-12-10 63 views
14

說我有以下幾點:獲取Haskell記錄的字段名稱作爲字符串列表?

data Rec = Rec { 
    alpha :: Int, 
    beta :: Double, 
    phi :: Float 
} 

sample = Rec 1 2.3 4.5 

我明白模板哈斯克爾&的reify功能可以得到我的記錄的域名。那就是:

print $(f sample) --> ["alpha", "beta", "phi"] 

還有一個聲稱,這可以在沒有模板哈斯克爾完成。有人可以爲此提供一個示例實現可以完成嗎?

+1

您也可以獲取沒有模板Haskell的字段名稱。 – augustss

+1

@augustss:怎麼樣?一些「Typable」黑魔法?無論哪種方式,大多數用戶可以將這些信息放在模板Haskell上。 – delnan

+3

@delnan你可以使用'Data.Data',或者你可以直接導出'Show',顯示'sample'並對該字符串進行一些解析。 – augustss

回答

15

它可以通過一個數據(大多數GHC版本)或通用(7.2.x及更高版本)實例來完成,GHC可以爲您推導。下面是如何使用Data類型類轉儲記錄字段的示例:

{-# LANGUAGE DeriveDataTypeable #-} 

import Data.Data 

data Rec = Rec { 
    alpha :: Int, 
    beta :: Double, 
    phi :: Float 
} deriving (Data, Typeable) 

sample = Rec 1 2.3 4.5 

main :: IO() 
main = print . constrFields . toConstr $ sample 
+5

你也可以避免使用'print'來使用類型的實例(在這個例子中是'sample')。映射constrFields。 dataTypeConstrs。 dataTypeOf $(undefined :: Rec)'。這將生成所有可用構造函數中所有字段的列表(並且當然可以根據您的喜好進行定製) – dflemstr

相關問題