下面的数据类型是磷脂酸(PA -脂质的一个子类)的表示。使用质谱法,可以获得不同层次的结构细节(即,从简单地知道脂质的质量一直到具有完整的结构特征)。
我当前的PA数据类型为-
data PA = ClassLevelPA IntegerMass
| CombinedRadylsPA CombinedRadyls
| UnknownSnPA Radyl Radyl
| KnownSnPA { paSn1 :: Radyl
, paSn2 :: Radyl }
deriving (Show, Eq, Ord)这将使用记录语法的构造函数和不使用记录语法的构造函数结合在一起(这可能是个坏主意)。或者,我可以执行以下操作之一-
data PA = ClassLevelPA { paIntegerMass :: IntegerMass }
| CombinedRadylsPA { paCombinedRadyls :: CombinedRadyls }
| UnknownSnPA { paR1 :: Radyl
, paR2 :: Radyl }
| KnownSnPA { paSn1 :: Radyl
, paSn2 :: Radyl }
data PA = ClassLevelPA IntegerMass
| CombinedRadylsPA CombinedRadyls
| UnknownSnPA Radyl Radyl
| KnownSnPA Radyl Radyl我目前没有使用访问器函数paSn1和paSn2,但我现在的想法是它们以后可能会有用。后一种方法更简洁,而且也避免了必须为不同的记录处理多个字段名(直到将OverloadedRecordFields扩展添加到GHC中为止)。在这三种表示中,哪一种更可取?对使用带有记录语法的构造函数和不使用记录语法的构造函数的立场是什么?
发布于 2015-10-22 12:16:19
广泛不鼓励对具有多个构造函数的数据类型使用访问器函数,因为这些函数将是部分的。我认为使用lens包中的棱镜和/或遍历可能会做得更好。棱镜为模式匹配和构造函数应用程序提供了一种lensy替代方案。遍历(更准确地说)允许您处理零个或多个事情,包括可能存在也可能不存在的字段。我相信,用于遍历的神奇模板Haskell函数会要求您包含访问器(名称以_开头),但您永远不需要直接使用这些访问器或导出它们。
https://stackoverflow.com/questions/33273164
复制相似问题