18

私が次を持っているとしましょう:

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

sample = Rec 1 2.3 4.5

テンプレートHaskellを理解しており、reify関数でレコードのフィールド名を取得できます。あれは:

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

テンプレートHaskellなしでこれを行うことができるという主張もあります。誰かがこれを達成できるための実装例を提供できますか?

4

1 に答える 1

19

これは、GHC が派生できる Data (ほとんどの GHC バージョン) または Generic (7.2.x 以降) インスタンスで実行できます。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 
于 2011-12-10T16:48:36.583 に答える