我创建了以下数据类型:
data IntroduceIdea = IntroduceIdea { id :: UUID , userId ::UUID , createdOn :: UTCTime,
ideaContent :: String } deriving (Eq,Show)
我与前奏(带有id字段)发生冲突...所以我添加了扩展名{-# LANGUAGE DuplicateRecordFields #-}
,但是将其粘贴到我使用的任何地方对我来说都是错的...您有更好的解决方案吗? ?
答案 0 :(得分:2)
威廉·范·昂塞姆(Willem Van Onsem)对其命名的建议introduceIdeaId
在我看来似乎是最惯用的解决方案。我花了一些时间来适应C#和F#,对象和记录通常由类字段或记录属性组成。
在这种语言中,如果没有这些字段或属性所附加的记录,您将无法真正引用它们,因此在字段名称中“重复”“对象”的名称似乎是多余的。>
在Haskell中,数据记录由一组功能组成。具体来说,该标签就是该功能:
> :t introduceIdeaId
introduceIdeaId :: IntroduceIdea -> UUID
该函数将一个IntroduceIdea
值作为输入,并返回一个UUID
作为输出。
在构造函数时,数据标签是“真实”函数会很有用。例如,如果您有一个IntroduceIdea
值(x
和y
)的(较小)列表,则可以提取introduceIdeaId
标签并将其变成{{1} }无点样式的值:
String
在这里,> fmap (show . introduceIdeaId) [x, y]
["c44a4cb1-f494-46b5-9459-9a022d364bfa","f3de5def-0bad-46a7-b3a2-604c7ecd54e6"]
被用作其实际功能。名称必须明确。如果我们使用了introduceIdeaId
这个名字,我们是要用id
还是IntroduceIdea -> UUID
还是不清楚。