说,我有很长的数据结构定义通用性但安全性选择哪种数据结构?
data A = A {
x1 :: String
, x2 :: String
...
, x50 :: String
}
现在我有3项任务:
- 创建像一个的实例草案{X1 = “这是X1”,...}
- 从一些其他数据结构创建一个实例
- 从甲
这三项任务涉及对标签x1,...,x50的繁琐复制。 更好的解决方案将是一个泛型列表
[
Foo "x1" aValue1
, Foo "x2" aValue2
...
]
,因为这会使穿越,创造一个更容易草案(列表定义为选秀的话)。缺点是将其他数据结构映射到这个映射将会更加危险,因为你失去了静态类型检查。
这是否有意义? 有没有一个通用但安全的解决方案?
编辑:给你一个更好的想法,它是关于将业务数据映射到文本表示,如表单和字母。例如:
data TaxData = TaxData {
taxId :: String
, income :: Money
, taxPayed :: Money,
, isMarried :: Bool
...
}
data TaxFormA = TaxFormA {
taxId :: Text
, isMarried :: Text
...
}
data TaxFormB = TaxFormB {
taxId :: Text
, taxPayedRounded :: Text
...
}
那些被转换成文本流,代表实际的形式。如果我在一次通行证和明年的任何一个表格字段都会移动时从税务数据中创建表单,是一个流浪的“0.0”,我不知道它属于哪里。这就是中间数据结构的用途:它可以很容易地创建草稿数据。
所以我需要将实际TaxData映射到那些中间形式的数据;我需要将这些表单数据映射到实际的表单文本表示;我需要创建草稿中间表单数据。一方面,我讨厌重复那些数据标签,另一方面它让我感到安全,我不会在映射时混淆任何标签。有没有银子弹?
相同类型(例如列表)的数据结构的所有元素,并且它们是否仅通过其索引进行区分?标签的数量有多重要? – 2011-05-11 07:57:42
标签的数量是有意义的,因为目前我必须在我的代码中至少复制大量数据标签3次。而且我基本上还需要在草稿模式中重复标签名称。 – LennyStackOverflow 2011-05-11 08:18:40
如何使用SYB或Uniplate?此外,您可能会在GHC中使用RecordWildcards扩展程序获得一些里程。 (发布大部分程序可能会对此有所帮助) – aleator 2011-05-11 09:16:40