Haskell 我的记录字段名称与同一范围内的其他记录字段冲突
我已创建以下数据类型:Haskell 我的记录字段名称与同一范围内的其他记录字段冲突,haskell,Haskell,我已创建以下数据类型: data IntroduceIdea = IntroduceIdea { id :: UUID , userId ::UUID , createdOn :: UTCTime, ideaContent :: String } deriving (Eq,Show) 我与前奏曲(id字段)有冲突。。。所以我添加了扩展名{-#LANGUAGE duplicate recordfields},但是我觉得在我使用它的
data IntroduceIdea = IntroduceIdea { id :: UUID , userId ::UUID , createdOn :: UTCTime,
ideaContent :: String } deriving (Eq,Show)
我与前奏曲(id字段)有冲突。。。所以我添加了扩展名
{-#LANGUAGE duplicate recordfields}
,但是我觉得在我使用它的地方粘贴它是不对的……你有更好的解决方案吗 Willem Van Onsem建议将其命名为introceidead,在我看来,这是最惯用的解决方案。这让我花了一些时间来适应,从C#和F#开始,对象和记录通常由类字段或记录属性组成
在这种语言中,如果没有附加到这些字段或属性的记录,就无法真正引用这些字段或属性,因此在字段名称中“重复”“对象”的名称似乎是多余的
在Haskell中,数据记录由一组函数组成。具体而言,该标签将是此函数:
> :t introduceIdeaId
introduceIdeaId :: IntroduceIdea -> UUID
它是一个函数,以introceidea
值作为输入,并返回UUID
作为输出
数据标签是“真实”函数在编写函数时非常有用。例如,如果您有一个introceidea
值(x
和y
)的(小)列表,您可以提取introceidead
标签,并以无点样式将其转换为String
值:
> fmap (show . introduceIdeaId) [x, y]
["c44a4cb1-f494-46b5-9459-9a022d364bfa","f3de5def-0bad-46a7-b3a2-604c7ecd54e6"]
这里,
introceideaid
用作它的函数。名称必须明确无误。如果我们使用了名称id
,如果我们的意思是introceidea->UUID
或a->a
为什么不将其重命名为introceidea
?它会毫无意义地增加很多冗长的内容,你不觉得吗?introceidea introceidea而不是id introceidea那么我不明白它在应用于特定类型时为什么会发生冲突。因为您将引入两个(或更多)的id
函数,以使用前奏曲的id
函数。一个有a->a
签名,另一个有introductionidea->UUID
我能用图书馆的镜头得到更灵活的东西吗?我现在正在读关于它的书…@尼古拉辛,我不这么认为;镜头不是我的强项,所以我可能错了,但我认为镜头也需要有唯一的名称。Haskell最惊人的缺点之一是不能在不同的记录类型中使用相同的字段名称。我将解释我们计划如何解决这个问题(与Adam Gundry合作),以及结果如何与镜头世界完美契合。
关于如何解决这个问题,我没有具体的例子,但我仍在研究:-)@NicolasHenin lens不允许您创建同名的记录字段,但它允许您创建具有相同名称的镜头,可以引用不同类型记录中的类似字段。