我的记录字段名称与同一范围中的其他记录字段冲突

时间:2018-09-06 08:44:19

标签: haskell

我创建了以下数据类型:

data IntroduceIdea = IntroduceIdea { id :: UUID , userId ::UUID , createdOn :: UTCTime,
                                 ideaContent :: String } deriving (Eq,Show)

我与前奏(带有id字段)发生冲突...所以我添加了扩展名{-# LANGUAGE DuplicateRecordFields #-},但是将其粘贴到我使用的任何地方对我来说都是错的...您有更好的解决方案吗? ?

1 个答案:

答案 0 :(得分:2)

威廉·范·昂塞姆(Willem Van Onsem)对其命名的建议introduceIdeaId在我看来似乎是最惯用的解决方案。我花了一些时间来适应C#和F#,对象和记录通常由类字段或记录属性组成。

在这种语言中,如果没有这些字段或属性所附加的记录,您将无法真正引用它们,因此在字段名称中“重复”“对象”的名称似乎是多余的。

在Haskell中,数据记录由一组功能组成。具体来说,该标签就是该功能:

> :t introduceIdeaId
introduceIdeaId :: IntroduceIdea -> UUID

该函数将一个IntroduceIdea值作为输入,并返回一个UUID作为输出。

在构造函数时,数据标签是“真实”函数会很有用。例如,如果您有一个IntroduceIdea值(xy)的(较小)列表,则可以提取introduceIdeaId标签并将其变成{{1} }无点样式的值:

String

在这里,> fmap (show . introduceIdeaId) [x, y] ["c44a4cb1-f494-46b5-9459-9a022d364bfa","f3de5def-0bad-46a7-b3a2-604c7ecd54e6"] 被用作其实际功能。名称必须明确。如果我们使用了introduceIdeaId这个名字,我们是要用id还是IntroduceIdea -> UUID还是不清楚。