Ich habe die folgende Datenstruktur des Blocks, die eine Bestandsaufnahme haben könnte, die Stapel von Gegenständen countain könnte:Wie ändert man den Wert von geschachtelten Optionals in OCaml einfach?
type item = Stone | Sand
type stack = {
item : item;
size : int
}
type inventory = {
inA : stack option;
inB : stack option;
out : stack option;
prc : item option
}
type blockType = Container | Solid
type block = {
blockType : blockType;
pos : vec;
oriented : vec option;
netID : int option;
sysID : int option;
inv : inventory option;
isMachine : bool
}
jetzt ich eine in der Theorie sehr einfache Funktion schreiben wollen, die einfach ein Element in die addiert " out "Slot eines Blocks Inventar. Meine sehr ausführlich Versuch war:
let addItem block =
let oldInv = get_some b.inv in
if is_some oldInv.out
then
let oldOut = get_some oldInv.out in
let newOut = {oldOut with size = oldOut.size+1} in
let newInv = {oldInv with out = Some newOut} in
{block with inv = Some newInv}
else
let newInv = {oldInv with out = Some {item=Stone; size=1}} in
{block with inv = Some newInv}
und ich auch diese Heler Funktionen mehrere verschachtelte Blöcke Spiel
let is_some v =
match v with
| None -> false
| Some _ -> true
let get_some v =
match v with
| None -> raise (Er "no some")
| Some s -> s
Wie könnte ich das in eine elegantere Weise zu vermeiden?
Wenn Ihre Frage ist, wie Sie dies auf eine elegantere Weise tun können, dann kann es eine gute Frage sein für [codereview] (https://codereview.stackexchange.com/). – vonaka