2011-05-11 7 views
4

일반성을 위해 어떤 데이터 구조를 선택해야하지만 안전합니까?

data A = A { 
    x1 :: String 
, x2 :: String 
... 
, x50 :: String 
} 

는 이제 3 개 태스크가 나가 긴 데이터 구조의 정의를 말한다 :

  1. 이 같은 초안 인스턴스 생성 {X1 내지 = "이 X1로", ...}
,536의 인스턴스로부터 또 다른 인스턴스 데이터를 만드는 다른 데이터 구조에서의 인스턴스를 생성

세 가지 작업은 lable x1, ..., x50의 완고한 복사를 포함합니다. 가 통과하고 훨씬 쉽게 초안을 작성을 할 것이기 때문에 더 나은 솔루션은 일반적인 목록을

[ 
    Foo "x1" aValue1 
, Foo "x2" aValue2 
... 
] 

일 것 (목록 정의는 이미 초안). 단점은 정적 유형 검사를 잃어 버리기 때문에 다른 데이터 구조를 여기 저기에 매핑하는 것이 더 위험 할 수 있다는 것입니다.

의미가 있습니까? 일반적이고 안전한 솔루션이 있습니까?

편집 : 더 나은 아이디어를 제공하기 위해 비즈니스 데이터를 양식 및 문자와 같은 텍스트 표현에 매핑하는 것이 좋습니다. 예 :

data TaxData = TaxData { 
    taxId :: String 
, income :: Money 
, taxPayed :: Money, 
, isMarried :: Bool 
... 
} 


data TaxFormA = TaxFormA { 
    taxId :: Text 
, isMarried :: Text 
    ... 
} 
data TaxFormB = TaxFormB { 
    taxId :: Text 
, taxPayedRounded :: Text 
... 
} 

이러한 것들은 실제 양식을 나타내는 텍스트 스트림으로 변환됩니다. 한 번에 세금 데이터로 양식을 작성하고 내년에 양식 필드가 이동 한 경우, 예를 들어 길잃은 "0.0"이되어서 그것이 어디에 속하는지 모르겠다. 이것이 바로 중간 데이터 생성을위한 것입니다. 초안 데이터를 쉽게 만들 수 있습니다.

그래서 실제 TaxData를 중간 양식 데이터에 매핑해야합니다. 그 양식 데이터를 실제 양식 텍스트 표현에 맵핑해야합니다. 중간 양식 데이터 초안을 작성해야합니다. 한 손으로 나는 그 데이터 레이블을 반복하는 것을 싫어한다. 반면에 그것은 매핑하는 동안 어떤 레이블도 혼동하지 않는다는 점에서 안전하다. 은색 탄환이 있습니까?

+1

동일한 유형 (예 : 목록)의 데이터 구조의 모든 요소가 모두 색인으로 만 구별됩니까? 레이블의 수는 어떤 식 으로든 중요합니까? –

+0

레이블의 수는 현재 중요한데, 왜냐하면 현재 코드에서 적어도 3 번 이상 많은 데이터를 복사해야하기 때문입니다. 그리고 나는 또한 기본적으로 드래프트 모드에서 라벨 이름을 반복해야합니다. – LennyStackOverflow

+0

SYB 또는 유니 플레이트 사용은 어떻습니까? 또한 GHC에서 RecordWildcards 확장으로 마일리지를 얻을 수 있습니다. (더 큰 부분을 게시하는 프로그램이 여기에 도움이 될 수 있습니다.) – aleator

답변

3

이렇게 심도있게 구조화 된 데이터는 하스켈에서 중첩 된 대수 데이터 형식으로 가장 관용적으로 표현됩니다. 왜? 그것은 데이터에 가장 많은 유형 구조와 안전성을 부여하여 기능이 데이터를 잘못된 형식으로 만드는 것을 방지합니다. 각 필드의 데이터 간 차이를 늘리기 위해 일부 유형을 newtyping하여 더 많은 안전을 확보 할 수 있습니다.

그러나 이처럼 매우 큰 ADT는 이름을 지정하고 조작하기가 쉽지 않습니다. 컴파일러 디자인의 일반적인 상황은 예를 들어 그러한 큰 ADT를 지정하고 컴파일러 코드를 작성하는 데 도움이됩니다. 일반적인 프로그래밍 기법을 많이 사용하는 경향이 있습니다. SYB, 메타 프로그래밍, 심지어 템플릿 하스켈 (Template Haskell) 우리가 필요로하는 보일러 판.

요약하면 요약하면 ADT 접근 방식을 유지하면서 제네릭 (예 : SYB 또는 템플릿 하스켈)을 사용하여 정의 및 도우미 함수 중 일부를 생성하는 방법을 살펴 보겠습니다.

+0

감사합니다. syb를 이해하려고합니다. – LennyStackOverflow

관련 문제