18

说我有以下内容:

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 的情况下完成。有人可以为此提供一个示例实现吗?

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 回答