Używam obiektywu bibliotekę Edwarda Kmett jest po raz pierwszy, a znalezienie go dość ładne, ale wpadłem na szkopuł ...Jak radzić sobie z niemożnością użycia soczewek z typami egzystencjalnymi?
pytaniem na [1] wyjaśnia, że kwantyfikatory egzystencjalne zakłócić makeLenses. Naprawdę wolę używać egzystencji z soczewkami w pewien sposób.
jako tło, mam klasę:
class (TextShow file, Eq file, Ord file, Typeable file) => File file where
fromAnyFile :: AnyFile -> Maybe file
fileType :: Simple Lens file FileType
path :: Simple Lens file Text.Text
provenance :: Simple Lens file Provenance
za rzeczywiste pytanie, chcę mieć typ:
data AnyFile = forall file . File file => AnyFile { _anyFileAnyFile :: File }
I chcę, aby móc napisać coś wzdłuż linii z:
instance File AnyFile where
fromAnyFile (AnyFile file) = cast file
fileType (AnyFile file) = fileType . anyFile
path (AnyFile file) = path . anyFile
provenance (AnyFile file) = provenance . anyFile
To nie działa, z powodów wyjaśnionych w [1]. Jeśli pytam GHC do informacji diagnostycznych kompilując z -ddump-splices
, otrzymuję:
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20
Sam splice jest puste, co oznacza dla mnie, że żadne deklaracje są produkowane przez nią. W tej części oczekuję i rozumiem teraz, że przeczytałem [1].
Chciałbym wiedzieć, jak mogę to zrobić - co mogę zrobić, aby obejść problem? Co mogę zrobić, aby uniknąć płynięcia pod prąd? Chciałbym móc uzyskać dostęp do dowolnej części moich struktur poprzez ścieżkę złożonych soczewek, ale ponieważ mam pola w innych typach takich jak Set AnyFile
, nie mogę tego zrobić, chyba że mogę uzyskać dostęp do zawartości obiektywu za pomocą AnyFile
.
[1] Existential quantifier silently disrupts Template Haskell (makeLenses). Why?
Dla każdego, kto zastanawia się, co zrobiłem, skorzystałem z sugestii poniżej; definicja musi być 'soczewka (\ (plik AnyFile) -> plik) (\ _ wartość -> wartość AnyFile)'. –