Я пытаюсь создать линзы для записей с одинаковыми именами полей. Наряду с этим я пытаюсь «обернуть/расширить» эти базовые записи и хочу, чтобы те же имена полей работали для обернутых/расширенных записей (что, как я полагаю, делают стильные линзы). Как заставить работать следующее:
-- Data types for context of the code snippet below
data Download = Download {
userId :: UserId
,gid :: Gid
,logId :: LogId
,parentId :: Maybe DownloadId
,createdAt :: UTCTime
,updatedAt :: UTCTime
}
data File = File {
downloadId :: DownloadId
,fpath :: String
,len :: Int
,createdAt :: UTCTime
,updatedAt :: UTCTime
}
data Url = Url {
downloadId :: DownloadId
,fileId :: FileId
,url :: URL
,createdAt :: UTCTime
,updatedAt :: UTCTime
}
data DownloadObject = DownloadObject {
_key :: DownloadId
,_dbDownload :: Download
,_dbFiles :: [FileObjects]
}
data FileObject = FileObject {
_key :: FileId
,_dbFile :: File,
,_dbUrls :: [UrlObjects]
}
data UrlObject = UrlObject {
_key :: UrlId
,_dbUrl :: Url
}
fetchDownload :: DownloadId -> DownloadObject
Учитывая эти типы данных, как мне заставить работать следующие линзы:
dload <- fetchDownload dloadId
dload ^. key -- of type DownloadId
dload ^. createdAt -- of type UTCTime
((dload ^. files) !! 1) ^. key -- of type FileId
((dload ^. files) !! 1) ^. createdAt -- of type UTCTime