如何在haskell中创建几种相关的数据类型?

俚语

我有一个User代表用户保存在数据库中的类型。但是,在显示用户时,我只想返回这些字段的子集,所以我做了一个不同的类型,而没有使用hash创建用户时,password将提供a而不是a hash,因此我为此创建了另一种类型。

这显然是最糟糕的,因为我的类型之间有很多重复。有没有更好的方法来创建几个都共享某些字段但添加某些字段而删除其他字段的相关类型呢?

{-# LANGUAGE DeriveGeneric #}

data User = User {
  id :: String,
  email :: String,
  hash :: String,
  institutionId :: String
} deriving (Show, Generic)

data UserPrintable = UserPrintable {
  email :: String,
  id :: String,
  institutionId :: String
} deriving (Generic)

data UserCreatable = UserCreatable {
  email :: String,
  hash :: String,
  institutionId :: String
} deriving (Generic)

data UserFromRequest = UserFromRequest {
  email :: String,
  institutionId :: String,
  password :: String
} deriving (Generic)

-- UGHHHHHHHHHHH
蒂洪·杰维斯

在这种情况下,我认为您可以User用函数替换各种类型。因此UserFromRequest,除了,还有:

userFromRequest :: Email -> InstitutionId -> String -> User

请注意,您还可以如何为Email分别设置类型InstitutionId,这将帮助您避免一堆烦人的错误。这与获取带有标记字段作为参数的记录的目的相同,同时还增加了一些额外的静态安全性。您可以将它们实现为新类型:

newtype Email = Email String deriving (Show, Eq)

同样的,我们可以更换UserPrintable使用showUser

UserCreatable但是可能有些尴尬,具体取决于您需要如何使用它。如果您所要做的只是将其作为参数并创建数据库行,则可以用相同的方式将其重构为函数。但是,如果您实际上需要一堆东西的类型,那么这不是一个好的解决方案。

在第二种情况下,您有几个不错的选择。一个就是每次id一个Maybe并检查一下。更好的方法是创建一个通用类型WithId a该通用类型id向任何内容添加一个字段:

data WithId a = { id :: DatabaseId, content :: a }

然后User使用no 类型,id并使数据库函数使用WithId User

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Haskell中创建我的个人定义数据类型的值

我如何在PostgreSQL中创建“ lo数据类型”

如何在Python中创建以下数据类型?

如何在Haskell中获取函数以使用数据类型返回多个类型?

haskell中的非穷尽模式,已创建数据类型

在 Haskell 中创建半群数据类型实例

如何在 umbraco 中创建表示自定义数据类型列表的自定义数据类型?

如何在Haskell中将数据类型转换为BSON?

如何在Haskell中检查自定义数据类型列表的长度?

如何在Haskell中以标记的并集数据类型获取值?

如何在haskell中声明两个包含相同变量的数据类型?

如何在 Haskell 中显示递归数据类型(树)的每个元素

如何在 Haskell 中访问没有记录语法的自定义数据类型的字段?

如何在python中创建具有不同数据类型的伪数据?

如何枚举Haskell中的递归数据类型?

如何在 Java 中创建具有多种数据类型的嵌套哈希图?

如何在 Kotlin/Native 中创建原始数据类型的 CPointer?

如何在TypeScript中为“日期”数据类型创建扩展方法

如何在GoLang中创建可以容纳多种数据类型的数组?

如何在Java中创建常规数据类型值的多重映射

如何在C#中创建原始数据类型?

如何在Apache Jena中创建用户定义的数据类型?

如何在informix中创建带有BLOB数据类型列的表?

如何在Java中创建自定义数据类型的HashSet?

如何在打字稿中创建自定义数据类型?

如何在C中创建和读取数据类型的动态数组?

如何在Coq中创建元组并将其用作新的数据类型

如何在Java中创建采用两种不同数据类型的arraylist或vector

如何在 Swift 4.2 中创建数据类型泛型