我正在尝试编写一个数据结构来描述我的简历中的项目,只是为了了解 Haskell 及其数据类型。这是我到目前为止所拥有的:
data Update = Talk { date :: Date,
pubTitle :: Text,
url :: URI,
venue :: Text
}
| Publication { date :: Date,
pubTitle :: Text,
venue :: Venue,
pubType :: PublicationType
}
| Award { date :: Date,
award :: Text,
awardedBy :: Link
}
| News { date :: Date, desc :: Markdown }
deriving Show
data PublicationType = Tutorial | Article | Chapter | Abstract
这显然行不通,因为 Haskell 认为我有多个
date
声明。等等。我见过this question答案建议使用扩展名,但我尝试添加 {-# LANGUAGE DuplicateRecordFields #-}
到我的文件顶部,它似乎没有帮助 - 我遇到了同样的错误。我怀疑有办法以某种方式重构这些记录,不是吗?或者也许我应该做一些完全不同的事情来传达这种数据结构。
最佳答案
您可以采取的一种方法是排除重复:
data Update = Update Date Event
data Event = News Markdown
| Award Text Link
| Artifact { title :: Text
, venue :: Venue
, artifact :: Accomplishment
}
data Accomplishment = Talk URI
| Publication PublicationType
在这里,我对 Artifact 构造函数使用了记录语法,但我不相信这是最好的方法。它创建的部分访问器非常糟糕;我只是使用它,因为否则不清楚 Text 字段的含义。您可以通过在 Text 周围定义 newtype 或类型别名来使用非记录语法来解决这个问题;或者您可以添加一个包含相同内容的命名 Artifact 类型,而 Artifact 构造函数只包含一个 Artifact。
关于haskell - 如何重构 Haskell 数据类型中的重复字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59721961/