Получить имена полей записи Haskell в виде списка строк? - PullRequest
15 голосов
/ 10 декабря 2011

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

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"]

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

1 Ответ

16 голосов
/ 10 декабря 2011

Это можно сделать с помощью экземпляра 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 
...