2011-07-01 5 views
3

레코드의 일부 값을 변경하는 방법?

type s_program = 
    { globals : s_var list; 
     main: s_block; } 
and s_var = 
    { s_var_name: string; 
     s_var_type: s_type; 
     s_var_uniqueId: s_uniqueId } 
and s_uniqueId = int 

내 프로그램의 한 지점에서 p: s_program 변수가 있지만 p.globals의 모든 요소를 ​​s_var_uniqueId으로 변경해야합니다 (예 : 1를 모든 s_var_uniqueId에 추가). 몇 가지 질문이 있습니다 :

1) 직접 p에서 관련 값을 수정하거나 새 값을 새 p':s_program

에 할당해야합니까? 2) 다음과 같이 작성할 수 있습니다.

let p' = 
    { p with 
    globals = List.map (fun var -> { var with s_var_uniqueId = var.s_var_uniqueId + 1 }) p.globals 

대단히 감사합니다.

편집 1 : 제안 된대로 with 부분을 수정하십시오.

답변

3

1과 올바른 with 부분) 당신이 필수적이나 함수형 프로그래밍 언어 :)로 OCaml의 사용 여부 따라 달라집니다. 이 전자를 있다면, 당신은 (필드 이름 앞에 가변 키워드를 추가하여) 가변 레코드 두 필드를 만든 다음 장소에 변경할 수 있습니다. 그러나 난 강력하게 그렇게하고하지 조언 것 :.

2) 두 번째 기록 수정을 위해 {...} 누락 것으로 보인다 것을 제외하고 (완벽하게 정상적으로 보이는 두 번째 접근 방식과 함께 할 것입니다

+0

고맙습니다 ... – SoftTimur

+0

@akoprowski :이 가능성을 잊어 버렸습니다 (변경 가능한 '키워드'). 더 명료하기 때문에'ref'를 선호합니다^_ ^ –

4

우선을 .. this section on record in OCamlthis chapter on modifiable data structures을 읽을 수 있습니다 언급 한 바와 같이, 당신이 기록을 변경할 수없는 것을 볼 수 둘째, 당신은 당신이 정말로 원하는 것을 생각해야 : 가변 기록, 변경 가능한 필드 또는 변경 가능한 필드를 변경할 수 기록과 기록을 예를 들어 있다고 가정합니다. 우리는 (이 ref 1에서 같은 예입니다) 복소수에 대한 기록이있다.

type complex = { re:float; im:float } ;; 

당신은

let c = {re=2.;im=3.} ;; 

같은 것을 당신은 변경할 수 없습니다 선언하는 경우도 cre (또는 im). 실제로 c := {re=4.;im=6.} ;; 또는 c.re := 4.;;은 모두 오류로 실패합니다. 변경 가능한 레코드를 얻으려면 c에 대한 참조를 사용해야합니다.

let c = ref {re=2.;im=3.} ;; 

그럼 당신은 c := {re=4.;im=6.} ;;c을 변경할 수 있습니다. 하지만 당신이 변경할 수있는 필드를 갖고 싶다고 생각합니다! 그런 다음 어느 필드가 변경 가능해야하는지 정확하게 설명해야합니다. 당신은 변경할 수 모든 필드를 원하는 당신이

type complex = { re:float ref; im:float ref } 
let make_complex r i = { re = ref r ; im = ref i } 
let c = make_complex 3. 4. 
;; 

를 작성하고 다음 그것은 float -> float ->()

let change_re c r = c.re := r ;; 
let change_im c i = c.im := i ;; 
let change_complex c r i = change_re c r ; change_im c i ;; 

그러나 유형의 기능 쉬울 것

c.re := 6. ; c.im := 7. ;; 

으로 필드를 변경할 수 있습니다 가정, 난 당신이 정말 당신의 코드에서 다음과 같은 필수 기능을 데려에 대해 생각하는 것이 좋습니다 것입니다. 이것은 쉽게 읽을 수있는 가능성을 망칠 수있는 간단한 방법 일 수 있습니다.

관련 문제