2013-10-10 1 views
2

나는 게터에서 Lens을 만들려고하고 나는 다른 Lens에서 가져온 세터 구축 :동일한 렌즈

그러나

import Control.Lens 

idL :: Lens s t a b -> Lens s t a b 
idL l = lens (\s -> view l s) (\s b -> set l b s) 

를, 그것은 모호한 (나를 위해) 오류와 함께 실패

Expected type: Getting a s a 
     Actual type: (a -> Accessor a b) -> s -> Accessor a t 
    In the first argument of `view', namely `l' 

내가 뭘 잘못하고 있니? 아마 뭔가 기본적인 것일 수도 있지만, 슬프게도 나 자신이 풀기 위해 실제로 일어나고있는 일 (Getting, Accessor)에 대해 아직 충분히 알지 못합니다.

+0

잘 작동합니다 ('Rank2 : Types' 언어 pragma 사용). 파일에서 모듈을로드하거나 repl에'idL'을 정의하려고합니까? –

+0

@ChrisTaylor : 파일에서,'Rank2Types'가 활성화되었습니다. 도움이된다면 렌즈 3.9.0.3 및 ghc-7.6.3도 사용하고 있습니다. – Artyom

+0

나는 GHCi에서도 이것을 실행했다. 문제는 없다. (명시적인 타입 서명이 필요하다.) – jozefg

답변

2

lens의 view 유형은 Lens 인수가 Lens s s a a이어야합니다. 일반적인 유형 Lens s t a b에서는 작동하지 않습니다. 그 이유는 view 유형이 일반화 된 경우 많은 유형 서명을 작성해야하기 때문입니다.

하지만 당신은 단지 형식 제한없이, 무엇을보기를 수행 할 수 있습니다 그 코드합니다 (Accessor newtype은을 제거하는) 너무 렌즈 HEAD와 함께 작동합니다, 그래서

import Control.Lens 
import Control.Applicative -- This imports Const 

idL :: Lens s t a b -> Lens s t a b 
idL l = lens (\s -> getConst $ l Const s) (\s b -> set l b s) 

내가 대신 Accessor 유형의 Const 사용을

+0

어떤 버전의 렌즈에서 '보기'가 단순화 되었습니까? 그것은 나를위한 것이 아닙니다 – jozefg

+0

렌즈 3.9.0.2를 사용하고 있습니다. [view] (http://hackage.haskell.org/package/lens-3.9.2/docs/Control-Lens-Getter.html#v:view)에는 'view :: Lens'sa' 유형이 있습니다 (주의 사항 그 '). – bennofs

+0

흥미로운 점은 GHC가 잘못된 렌즈 버전을 사용하는 것을 혼란스럽게 보였습니다. 으악 – jozefg