gpt4 book ai didi

haskell - 在 Haskell 中建模领域数据

转载 作者:行者123 更新时间:2023-12-03 14:02:22 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.


3年前关闭。







Improve this question




我正在使用 Haskell 设计一个更大的 Web 应用程序。这纯粹是为了我的教育和兴趣。

我首先写出我的域/值对象。一个例子是用户。这是我到目前为止想出的

module Model (User) where

class Audited a where
creationDate :: a -> Integer
lastUpdatedDate :: a -> Integer
creationUser :: a -> User
lastUpdatedUser :: a -> User

class Identified a where
id :: a -> Integer

data User = User { userId :: Integer
, userEmail :: String
, userCreationDate :: Integer
, userLastUpdatedDate :: Integer
, userCreationUser :: User
, userLastUpdatedUser :: User
}

instance Identified User where
id u = userId u

instance Audited User where
creationDate u = userCreationDate
lastUpdatedDate u = userLastUpdatedDate
creationUser u = userCreationUser
lastUpdatedUser u = userLastUpdatedUser

我的应用程序将有大约 20 种类型,如上述类型。当我说“像上面的类型”时,我的意思是他们将有一个 id、审计信息和一些特定于类型的信息(如用户的电子邮件)。

我无法理解的是,我的每个字段(例如 User.userEmail)都创建了一个新函数 fieldName :: Type -> FieldType .有 20 种不同的类型,命名空间似乎很快就会变得非常满。另外,我不喜欢将我的用户 ID 字段命名为 userId。 .我宁愿把它命名为 id .有没有办法解决?

也许我应该提到我来自命令式世界,所以这个 FP 的东西对我来说是相当新的(但非常令人兴奋)。

最佳答案

是的,命名空间在 Haskell 中可能是一种痛苦。我通常最终会收紧我的抽象,直到没有那么多名字。它还允许更多的重用。对于你的,我会为审计信息创建一个数据类型而不是一个类:

data Audit = Audit {
creationDate :: Integer,
lastUpdatedDate :: Integer,
creationUser :: User,
lastUpdatedUser :: User
}

然后将其与特定于类型的数据配对:
data User = User { 
userAudit :: Audit,
userId :: Integer,
userEmail :: String
}

如果需要,您仍然可以使用这些类型类:
class Audited a where
audit :: a -> Audit

class Identified a where
ident :: a -> Integer

然而,随着您的设计的发展,对这些类型类消失的可能性持开放态度。类对象类型类——每个方法都接受一个 a 类型的参数——有办法简化自己。

解决此问题的另一种方法可能是使用参数类型对对象进行分类:
data Object a = Object {
objId :: Integer,
objAudit :: Audit,
objData :: a
}

看看吧, ObjectFunctor !
instance Functor Object where
fmap f (Object id audit dta) = Object id audit (f dta)

根据我的设计直觉,我更倾向于这样做。如果不了解您的计划,很难说哪种方式更好。看,对这些类型类的需求消失了。 :-)

关于haskell - 在 Haskell 中建模领域数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5775068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com