【问题标题】:Get a Haskell record's field names as a list of strings?获取 Haskell 记录的字段名称作为字符串列表?
【发布时间】:2012-01-17 11:26:15
【问题描述】:

假设我有以下内容:

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

【问题讨论】:

  • 不用模板Haskell也可以得到字段名。
  • @augustss:怎么样?一些Typable黑魔法?无论哪种方式,大多数用途都可以将这些信息用于 Template Haskell。
  • @delnan 您可以使用Data.Data,也可以只派生Show,显示sample,然后对该字符串进行一点解析。
  • 我没有看到很多令人信服的理由来实际这样做。

标签: haskell template-haskell reify


【解决方案1】:

可以使用 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 

【讨论】:

  • 您还可以通过使用print . map constrFields . dataTypeConstrs . dataTypeOf $ (undefined :: Rec) 来避免使用类型的实例(在这种情况下为sample)。这将生成所有可用构造函数中所有字段的列表(当然可以根据您的喜好定制)
猜你喜欢
  • 2011-12-17
  • 2012-01-29
  • 2013-09-30
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多