openlang

레코드 갱신 대상을 명시적으로 구분할 수 있나요?

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    RecordWildCards를 사용한다면 case recordA of MkA {..} -> MkA {c = 17, ..}처럼 할 수 있지만, 저도 만족스럽지는 않네요.

    그냥 MkA {c = 17, ..recordA}라고 써서 recordA의 모든 필드를 새 레코드로 가져올 수 있다면 좋겠어요.

    영어에서 번역원문 보기
  2. 고유 링크

    또는

    main = do
        print $ let MkA {..} = recordA in MkA {c = 17, ..}

    문법이 보기 흉하긴 해도, 기존 데이터를 제자리에서 바꾸는 게 아니라 완전히 새 데이터를 할당한다는 점은 분명하게 드러냅니다. 그래서 저는 이런 형태의 표기법을 선호할 것 같아요

    MkA { c = 17
        , .. = recordA
        }
    영어에서 번역원문 보기
  3. 고유 링크

    recordA에 타입 주석을 하나 더 달면 됩니다. 예를 들어 해당 줄을 print $ (recordA :: A) {c = 17}로 바꾸는 거죠. 경고가 나오지만 {-# OPTIONS_GHC -Wno-ambiguous-fields #-}로 안전하게 끌 수 있어요. 나중에는 {-# LANGUAGE OverloadedRecordUpdate #-}를 추가하고 그 주석을 다시 없앨 수 있을 겁니다.

    정말 이 상황 전부 끔찍하죠. (https://discourse.haskell.org/t/what-are-you-supposed-to-do-about-wambiguous-fields/9545/22)

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 다른 클래스 안에 있는 클래스를 상속하려면 어떻게 하나요?

    안녕하세요, 제가 코드를 바꿀 수 없는 패키지에 다음과 같은 클래스 계층이 있어요: 편하게 쓰려고 Inner를 감싸는 래퍼를 추가하려는데, Inner가 바깥 인스턴스에 의존해서 지금까지는 바깥 클래스의 서브클래스 안에 넣는…

    답글 1최근 활동 scala
  2. Lean4의 have 바인딩과 let 바인딩 비교

    아래 두 표현식을 보니 그리고 똑같이 동작하더군요. 정리를 증명할 때도 마찬가지예요. 서로 바꿔 써도 되나요? 차이가 뭔가요?

    답글 3최근 활동 lean-4
  3. 문자열 배열을 값으로 갖는 TypeScript Map 초기화

    각 항목이 문자열 배열을 담는 Map을 만들고 있어요. 타입 선언과 초기화를 한 문장으로 같이 하려면 어떻게 하나요? 제 (단순한) 시도는 이랬어요: 그랬더니 이렇게 나와요:

    답글 2최근 활동 typescript