Получить имена полей записей 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