odelagem de dados de domínio em Haskell [fechado]

Estou trabalhando no design de um aplicativo da web maior usando Haskell. Isso é apenas para minha educação e interesse.

Estou começando escrevendo meus objetos de domínio / valor. Um exemplo é um usuário. Aqui está o que eu criei até agora

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

Minha aplicação terá aproximadamente 20 tipos, como o tipo acima. Quando digo "como o tipo acima", quero dizer que eles terão um ID, informações de auditoria e algumas informações específicas de tipo (como e-mail no caso de Usuário).

O que eu não consigo entender é o fato de que cada um dos meus campos (por exemplo, User.userEmail) cria uma nova funçãofieldName :: Type -> FieldType. Com 20 tipos diferentes, o espaço para nome parece ficar muito rápido. Além disso, não gosto de nomear meu campo de ID do usuáriouserId. Prefiro nomearid. Existe alguma maneira de contornar isso

Talvez eu deva mencionar que estou vindo do mundo imperativo, então esse material de FP é bem novo (mas emocionante) para mi

questionAnswers(3)

yourAnswerToTheQuestion