아직 구현중인 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이 될 수 있기를 기대합니다. (따라서 필드 이름을 밑줄로 시작하고 TemplateHaskell
을 makeLenses
으로 설정하는 것을 멈출 수 있습니다.)
ghc의 향후 릴리스에서이 작업을 수행 할 수 있습니까? – Larry
아마 그것이 작동하게하는 방법을 찾지 못했을 것입니다. – immibis