2016-12-07 6 views
7

관련 게시물 : How to disambiguate selector function?왜 DuplicateRecordFields는 유형 유추를 가질 수 없습니까?

https://ghc.haskell.org/trac/ghc/wiki/Records/OverloadedRecordFields/DuplicateRecordFields

그러나, 우리는 데이터 유형을 결정하는 인수의 유형을 추론하거나 제약 해결사로 검색을 연기의 어떤 방법이 없습니다.

실제로이 기능이 구현되지 않았습니다. 여러 소스를 찾으려고했지만 유형을 추론하지 않기로 결정한 이유를 찾을 수 없습니다.

아무도 이것에 대한 좋은 이유를 알고 있습니까? 현재의 시스템 유형의 한계 때문에 그렇습니까?

+0

ghc의 향후 릴리스에서이 작업을 수행 할 수 있습니까? – Larry

+0

아마 그것이 작동하게하는 방법을 찾지 못했을 것입니다. – immibis

답변

9

아직 구현중인 OverloadedRecordFields에 관심이 있습니다.


현재 구현은 너무 많은 새로운 내용을 한꺼번에 도입하지 않기 위해 의도적으로 불구가되었습니다. 레코드 투영 유형을 추정하는 것은 벌레 (이 확장자가 언급 한)의 불쾌한 깡통을 열어주는 것으로 밝혀졌습니다.

는 다음 GHCi 상호 작용

ghci> data Record1 = Record1 { field :: Int } 
ghci> data Record2 = Record2 { field :: Bool } 
ghci> :t field 

을 고려 field의 유형이 지금 무엇을해야 하는가? 어떻게 든 우리는 "field이라는 필드를 가진 어떤 레코드"라는 개념을 포착 할 방법이 필요합니다.

class HasField (x :: k) r a | x r -> a where 
    getField :: r -> a 

HasField x r a 제약 x이 속하는 유형 a의 필드라는 사실을 나타냅니다이를 위해, OverloadedRecordFields는 내장 타입 클래스

새로운 모듈 GHC.Records는 다음과 같은 정의 새로운 소개 레코드 유형 r. getField 메서드는 레코드 선택기 함수를 제공합니다.

위의 예에서 GHC가 다음 인스턴스를 마술처럼 생성 한 것입니다. 사실 실제로 일어날 것은 아니지만 좋은 첫 번째 근사입니다.

instance HasField "field" Record1 Int where 
    getField (Record1 f) = f 

instance HasField "field" Record2 Bool where 
    getField (Record2 f) = f 

관심이 있으시면 제안서를 읽는 것이 좋습니다. 내가 언급하지 않은 다른 특징은 IsLabel 클래스입니다. 이 모든 것이 구현되면 (그리고 레코드를 업데이트하기 위해 좀 더) get my lenses for free이 될 수 있기를 기대합니다. (따라서 필드 이름을 밑줄로 시작하고 TemplateHaskellmakeLenses으로 설정하는 것을 멈출 수 있습니다.)