질문을 이해하면 두 가지 방법으로 원하는 것을 얻을 수 있습니다.
당신은 다음의 예와 같이, 태그의 종류에 변경 가능한 데이터 구조를 사용
type tag = string ref;;
type xml = Element of tag * xml list | CharData of string;;
let xml_test = Element (ref "person",
[CharData "text0";
Element (ref "phoneNumber", [CharData "text2"]);
CharData "text1";
Element (ref "phoneNumber", [CharData "text3"])]);;
let modify_tag tag new_value=
tag := new_value;;
let rec modify_and_print_xml xml =
match xml with
Element (tag, xlist) -> modify_tag tag (!tag^"_modified");
print_string (!tag); print_newline();
(*here you do the recursive call*)
List.iter (fun element -> modify_and_print_xml element) xlist
|CharData str -> print_string str; print_newline();;
modify_and_print_xml xml_test;;
그렇지 않으면
하고 함수형 프로그래밍에 새로운 있기 때문에, 가장 좋은 방법은 그것에 대해 생각하려면를 수정하지 않습니다 태그 값을 수정하지만 수정 된 태그가있는 새 xml 값을 생성하십시오 (이것은 순전히 기능을 코딩하고 부작용을 제거하기 위해 수행해야합니다). 여기
, 당신은 "전화"에서 "PHONENUMBER"라는 이름의 모든 태그를 수정 싶은 말은 예입니다
let rec get_modified_xml xml =
match xml with
Element (tag, xlist) -> if (!tag = "phoneNumber") then
Element(ref "phone", List.map (fun element -> get_modified_xml element) xlist)
else
Element (tag, List.map (fun element -> get_modified_xml element) xlist)
| _ -> xml;;
get_modified_xml xml_test;;
출력 :
- : xml =
Element ({contents = "person"},
[CharData "text0"; Element ({contents = "phone"}, [CharData "text2"]);
CharData "text1"; Element ({contents = "phone"}, [CharData "text3"])])