首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对具有多个构造函数的代数数据类型使用记录语法

对具有多个构造函数的代数数据类型使用记录语法
EN

Stack Overflow用户
提问于 2015-10-22 11:55:33
回答 1查看 534关注 0票数 6

下面的数据类型是磷脂酸(PA -脂质的一个子类)的表示。使用质谱法,可以获得不同层次的结构细节(即,从简单地知道脂质的质量一直到具有完整的结构特征)。

我当前的PA数据类型为-

代码语言:javascript
复制
data PA   = ClassLevelPA       IntegerMass
          | CombinedRadylsPA   CombinedRadyls
          | UnknownSnPA        Radyl Radyl
          | KnownSnPA          { paSn1 :: Radyl
                               , paSn2 :: Radyl }
          deriving (Show, Eq, Ord)

这将使用记录语法的构造函数和不使用记录语法的构造函数结合在一起(这可能是个坏主意)。或者,我可以执行以下操作之一-

代码语言:javascript
复制
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中为止)。在这三种表示中,哪一种更可取?对使用带有记录语法的构造函数和不使用记录语法的构造函数的立场是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-10-22 12:16:19

广泛不鼓励对具有多个构造函数的数据类型使用访问器函数,因为这些函数将是部分的。我认为使用lens包中的棱镜和/或遍历可能会做得更好。棱镜为模式匹配和构造函数应用程序提供了一种lensy替代方案。遍历(更准确地说)允许您处理零个或多个事情,包括可能存在也可能不存在的字段。我相信,用于遍历的神奇模板Haskell函数会要求您包含访问器(名称以_开头),但您永远不需要直接使用这些访问器或导出它们。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33273164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档