나는 ...실존 유형의 렌즈를 사용하지 못하는 문제를 해결하려면 어떻게해야합니까?
[1] 존재 한정사가 makeLenses을 방해한다고 설명에서 문제를 처음으로 에드워드 Kmett의 렌즈 라이브러리를 사용하여, 그것은 오히려 좋은 발견,하지만 난 난관에 부딪쳤다하고있다. 나는 오히려 어떤 방식으로 렌즈와 실존 적을 사용하기를 원합니다.
을 배경으로, I 클래스가 : 실제 질문에 대한
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
을, 나는 유형 갖고 싶어 :
data AnyFile = forall file . File file => AnyFile { _anyFileAnyFile :: File }
을 그리고 난 라인을 따라 뭔가를 쓸 수 있도록하려면 of :
[1]에서 설명한 이유 때문에 작동하지 않습니다. 내가 -ddump-splices
로 컴파일하여 정보를 디버깅 GHC을 요구하는 경우에, 나는 얻을 :
Haskell/Main.hs:1:1: Splicing declarations
makeLenses ''AnyFile ======> Haskell/Main.hs:59:1-20
스플 라이스 자체는 아무런 선언이 그것에 의해 생산되지 않았는지 나에게 나타냅니다, 비어 있습니다. 이 부분은 내가 읽었으니 이제는 기대하고 이해합니다. [1].
내가 알고 싶은 것은 어떻게 할 수 있는가입니다. 문제를 해결하려면 어떻게해야합니까? 이것에 대해 상류에서 수영하는 것을 피하기 위해 무엇을해야합니까? 합성 렌즈의 경로를 통해 구조의 어느 부분에도 접근 할 수 있기를 원하지만, Set AnyFile
과 같은 다른 유형의 필드가 있기 때문에 AnyFile
렌즈에 액세스 할 수없는 한 그렇게 할 수 없습니다.
[1] 최악의 경우 Existential quantifier silently disrupts Template Haskell (makeLenses). Why?
궁금한 분을 위해서, 내가 한 것은 아래의 제안을 사용하는 것이 었습니다. 정의는'lens (\ (AnyFile file) -> file) (\ _ value -> AnyFile value)'일 필요가있다. –