Tôi đang sử dụng ống kính thư viện Edward Kmett cho lần đầu tiên, và tìm thấy nó khá đẹp, nhưng tôi chạy vào một snag ...Làm thế nào để làm việc xung quanh không có khả năng sử dụng ống kính với các loại tồn tại?
Câu hỏi tại [1] giải thích rằng quantifiers hiện sinh phá vỡ makeLenses. Tôi thực sự muốn sử dụng một tồn tại với ống kính trong một số thời trang.
Là nền, tôi có lớp:
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
Đối với câu hỏi thực tế, tôi muốn có các loại:
data AnyFile = forall file . File file => AnyFile { _anyFileAnyFile :: File }
Và tôi muốn để có thể viết một cái gì đó dọc theo dòng của:
instance File AnyFile where
fromAnyFile (AnyFile file) = cast file
fileType (AnyFile file) = fileType . anyFile
path (AnyFile file) = path . anyFile
provenance (AnyFile file) = provenance . anyFile
Điều này không hiệu quả, vì lý do được giải thích trong [1]. Nếu tôi hỏi GHC cho thông tin gỡ lỗi bằng cách biên dịch với -ddump-splices
, tôi nhận được:
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20
Các mối nối chính nó là trống, mà chỉ ra cho tôi rằng không có tờ khai được sản xuất bởi nó. Phần này tôi mong đợi và hiểu bây giờ tôi đã đọc [1].
Điều tôi muốn biết là cách tôi có thể thực hiện việc này - tôi có thể làm gì để khắc phục sự cố này? Tôi có thể làm gì để tránh bơi ngược dòng về điều này? Tôi muốn có thể truy cập vào bất kỳ phần nào của cấu trúc thông qua một ống kính sáng tác, nhưng vì tôi có các loại khác với các loại như Set AnyFile
, tôi không thể làm như vậy trừ khi tôi có thể truy cập nội dung của AnyFile
bằng ống kính.
[1] Existential quantifier silently disrupts Template Haskell (makeLenses). Why?
Chỉ cần cho bất cứ ai tự hỏi, những gì tôi đã làm là sử dụng gợi ý dưới đây; định nghĩa cần phải là 'thấu kính (\ (tập tin AnyFile) -> tập tin) (\ _ giá trị -> giá trị AnyFile)'. –