如果我理解你的問題,你可以用兩種不同的方式實現你想要的。
你有你的標籤類型使用可變數據結構,比如下面的例子:
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"])])