2013-08-05 2 views
6

나는 ...실존 유형의 렌즈를 사용하지 못하는 문제를 해결하려면 어떻게해야합니까?

[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?

+0

궁금한 분을 위해서, 내가 한 것은 아래의 제안을 사용하는 것이 었습니다. 정의는'lens (\ (AnyFile file) -> file) (\ _ value -> AnyFile value)'일 필요가있다. –

답변

7

, 당신은 항상 모든 템플릿 하스켈에 의존하지 않고 렌즈를 직접 구현할 수 있습니다. 게터와 유형에 대한 세터 기능을 제공 예를 들어

는, 당신은 lens 기능을 사용하여 렌즈를 만들 수 있습니다

lens :: (s -> a) -> (s -> b -> t) -> Lens s t a b 

나는 이것이 가장 성능이 좋은 옵션이 될 수 없습니다 생각을하지만, 확실히이다 쉬운.

나는 (일반적으로 실존 유형 또는)이 경우에이 작업을 수행하는 방법을 알고 있지만, 여기에 기록하여 사소한 예입니다하지 않습니다

data Foo = Foo { _field :: Int } 
foo = lens _field (\ foo new -> foo { _field = new }) 

는 희망이 적용 충분히 아이디어를 설명을 귀하의 코드에.

+0

흠 ... 나는 렌즈 기능에 대해 몰랐다. 고맙습니다! 문서는 오히려, 어, 큰 것입니다. :) 나는 지금 뭔가 일을하려고 노력 중이며, 그렇다면 답을 받아 들일 것입니다. :) –

+1

적어도 내 버전에서는 렌즈의 종류가'Functor f => (s -> a -> (s -> b -> t) -> (a -> fb) -> s -> ft'. 괜찮아. 어떤 일종의 연속 통과 (continuation-passing) 일 것 같아요, 아마 그것을 알아낼 수 있습니다 ... –

+0

오, 알았어요. 권리. 나머지 두 요소는 렌즈 자체의 일부이기 때문에 처음 두 매개 변수 만 필요합니다 ... 아마도 문서가 's'이 무엇인지 설명 할 수 있습니다. –

관련 문제