Получить имена полей записей Haskell в виде списка строк?

Скажем, у меня есть следующее:

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

sample = Rec 1 2.3 4.5

Я понимаю, что Template Haskell и функция reify могут получить мне имена полей записи. То есть:

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

Существует также утверждение, что это можно сделать без Template Haskell. Может ли кто-нибудь предоставить пример реализации для этого может быть достигнуто?

Ответы

Ответ 1

Это можно сделать с помощью Data (большинство версий GHC) или экземпляра Generic (7.2.x и выше), который GHC может получить для вас. Вот пример того, как сбрасывать поля записи с помощью класса данных:

{-# 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