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

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

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

sample = Rec 1 2.3 4.5

Я понимаю шаблон Haskell & the reify Функция может получить мне имена полей записи. То есть:

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

Существует также утверждение, что это можно сделать без использования шаблона 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 
Другие вопросы по тегам