Estoy trabajando en el diseño de una aplicación web de mayor tamaño utilizando Haskell. Esto es puramente para mi educación e interés.Modelado de datos de dominio en Haskell
Estoy empezando por escribir mi dominio/objetos de 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 "como el tipo anterior", quiero decir que tendrán una identificación, información de auditoría y cierta información específica del tipo (como el correo electrónico en el caso del Usuario).
Lo que no puedo dejar de pensar es que cada uno de mis campos (por ejemplo, User.userEmail) crea una nueva función fieldName :: Type -> FieldType
. Con 20 tipos diferentes, parece que el espacio de nombres se llenará bastante rápido. Además, no me gusta tener que llamar mi campo de ID de usuario userId
. Prefiero llamarlo id
. ¿Hay alguna forma de evitar esto?
Tal vez debería mencionar que vengo del mundo imperativo, por lo que este FP es bastante nuevo (pero bastante emocionante) para mí.
Puede usar el sistema de módulos para controlar el alcance y la calificación del nombre. –
¿Esto significaría crear un módulo para cada tipo y hacer un 'Modelo de usuario calificado como usuario' (por ejemplo)? –
Oh, simplemente usando 'import qualified' para controlar el problema de explosión del campo de etiqueta de registro. –