Datos de dominio de modelado en Haskell [cerrado]

Estoy trabajando en el diseño de una aplicación web más grande con Haskell. Esto es puramente para mi educación e interés.

Estoy comenzando escribiendo mis objetos de dominio / valor. Un ejemplo es un usuario. Esto es lo que se me ocurrió hasta ahora

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

Mi aplicación tendrá aproximadamente 20 tipos como el tipo anterior. Cuando digo "me gusta el tipo anterior", quiero decir que tendrán una identificación, información de auditoría y alguna información específica del tipo (como correo electrónico en el caso del Usuario).

o que no puedo entender es el hecho de que cada uno de mis campos (por ejemplo, User.userEmail) crea una nueva funciónfieldName :: Type -> FieldType. Con 20 tipos diferentes, el espacio de nombres parece que se llenará bastante rápido. Además, no me gusta tener que nombrar mi campo de ID de usuariouserId. Prefiero nombrarloid. ¿Hay alguna forma de evitar esto?

Tal vez debería mencionar que vengo del mundo imperativo, por lo que este material de FP es bastante nuevo (pero bastante emocionante) para mí.

Respuestas a la pregunta(3)

Su respuesta a la pregunta