I 항목의 스택 countain 수있는 재고 할 수 블록의 다음과 같은 데이터 구조를 가지고 :OCaml에서 중첩 된 선택 사항의 값을 쉽게 변경하는 방법은 무엇입니까?
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
}
지금 내가 단순히 항목을 추가하는, 이론, 아주 간단한 함수를 작성 할를 " 블록 인벤토리의 "출력"슬롯에 있습니다. 내 매우 자세한 시도는이이었다
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}
을하고 난 여러 중첩 된 경기 블록
을 방지하기 위해 이러한 heler 기능을 사용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
어떻게 더 우아한 방법으로이 작업을 수행 할 수 있습니까? 여기
질문이 더 우아한 방법으로 할 수 있다면 [codereview] (https://codereview.stackexchange.com/)에 대한 좋은 질문 일 수 있습니다. – vonaka