我正在使用Haskell设计一个比较大型的Web应用程序,这完全是出于教育和兴趣。
我首先要开始编写我的领域/值对象。其中一个例子是用户(User)。以下是我目前想到的内容:
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中的电子邮件)。
我无法理解的是,每个字段(例如User.userEmail)都会创建一个新的函数fieldName :: Type -> FieldType
。对于20种不同的类型,命名空间似乎会很快变得非常拥挤。此外,我不喜欢将我的用户ID字段命名为userId
。我更愿意将其命名为id
。这有没有办法避免呢?
也许我应该提一下,我来自命令式编程世界,所以这个FP东西对我来说还是很新的(但也很令人兴奋)。
import qualified
来控制记录标签字段爆炸问题。 - Don Stewartid
作为函数名是个不好的选择;在Prelude中已经定义了它表示恒等函数(id :: a -> a
,id x = x
)。 - Antal Spector-Zabuskyid
通常用于持久化数据中的对象ID。在解决冲突时,我认为两种方法都是合理的。 - John Lid
在Haskell预定义中,我通常使用ident
。 - luqui