haskell - 如何重构 Haskell 数据类型中的重复字段名称?

标签 haskell

我正在尝试编写一个数据结构来描述我的简历中的项目,只是为了了解 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/

相关文章:

haskell - 为什么 Just ord <*> Nothing 得到 'variable not in scope'?

haskell - 有没有办法在 Haskell 中捕获高阶函数的元组?

haskell - 声明用于 N×N 元素矩阵和 N 元素列向量相乘的类型类

java - 如何从 Java 调用 Haskell

haskell - 在 Haskell 中树 a -> a 的 Nil 值

haskell - 针对只有一个构造函数的类型进行模式匹配

haskell - 搜索重写规则

haskell - 如何使类型成为 Eq 的实例

haskell - 是什么让 Haskell 中的两个类型表达式等效?

haskell - IO Monad 中的链式 if/else 语句