2017-09-24 6 views
0

중첩 된 레코드로 기능 업데이트 구문 { record with key = value }을 사용하려면 ppx 확장 또는 유사 기능을 사용하는 방법이 있습니까?중첩 된 레코드로 OCaml 기능 업데이트

예를 들어, 다음 예제 프로그램에서는 필자가 "내부"레코드를 대상으로하고 싶을 때 가장 바깥 쪽 레코드 만 기능적으로 업데이트하고 있습니다.

type outer = { 
    a : float; 
    b : inner 
} 
and inner = { 
    c : float; 
} 

let item = { a = 0.4; b = { c = 0.7 } } 

let() = ignore { item with b = { c = 0.8 } 

inner에 필드가 두 개 이상 있으면 편리하지 않게됩니다.

나는 다음 (strawman 구문)과 같이 쓸 수 있도록하고 싶습니다 : 나는 당신이 사용하고있는 가정

{ item with b = { item.b with c = 0.8 } } 

: 당신은 바로 OCaml의이 쓸 수

let() = ignore { item with b.c = 0.8 } 

답변

1

을 예제의 경우에만 ignore; 기능적 레코드 업데이트의 결과를 무시하는 것은 의미가 없습니다.

+0

어떤 의미에서 대답은 "아니오"인 것처럼 보입니다. '{key = value}를 가진 레코드 '에서'key'처럼 들린다는 것은 오직 하나의 필드 일 뿐이며'key'-position에서 더 많은 종류의 것들을 허용하는 일반적으로 사용되는 확장은 없습니다 ... 아마도 이런 기능을 여러 가지 기능으로 업데이트 할 수 있습니다. –

+0

예, 곧장 OCaml의 문법은'with' 뒤에 * field *를 요구합니다. 이것은 (레코드 유형이 정의 된) 모듈을 포함하는 이름 앞에 붙는 단일 식별자입니다. –