Я работаю над созданием более крупного веб-приложения с использованием Haskell. Это чисто для моего образования и интереса.
Я начинаю писать свои объекты домена/значения. Одним из примеров является Пользователь. Вот что я до сих пор придумал
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 типов, подобных описанному выше. Когда я говорю "как вышеупомянутый тип", я имею в виду, что они будут иметь идентификатор, аудиторскую информацию и некоторую информацию о типе (например, электронную почту в случае с пользователем).
То, что я не могу обойти, - это тот факт, что каждое из моих полей (например, User.userEmail) создает новую функцию fieldName :: Type -> FieldType
. С 20 различными типами пространство имен кажется, что оно будет довольно полным довольно быстро. Кроме того, мне не нравится называть поле User ID userId
. Я бы назвал его id
. Есть ли способ обойти это?
Может быть, я должен упомянуть, что я родом из императивного мира, поэтому этот материал FP является довольно новым (но довольно захватывающим) для меня.