2016-09-03 4 views
0

私は一致ステートメントを持っていると思いますが、私に記録へのアクセス権を与えるとそうのようなそのフィールドの一部:だからここOCamlのパターンマッチレコードと1文でフィールド

| Some n {left = Some l; right = Some r} -> dostuff... 

、私はを参照することができますレコード(n)、そのフィールドはl、右はrとなります。これは可能ですか?

私はこの

let rec remove_node root v = 
    match root with 
    | None -> root 
    | Some n when v > n.value -> do_a... 
    | Some n when v < n.value -> do_b... 
    | Some n when {left = Some l; right = Some r} -> do_c... 
    | Some {right = Some r} -> do_d... 
    | Some {left} -> do_e... 

ような何かをしたいしかし、私は現在、これを書いています:

let rec remove_node root v = 
    match root with 
    | None -> root 
    | Some n -> 
     (match n with 
     | _ when v > n.value -> do_a... 
     | _ when v < n.value -> do_b... 
     | {left = Some l; right = Some r} -> do_c... 
     | {right = Some r} -> do_d... 
     | {left}    -> do_e... 
    ) 

それほど悪くないですが、私は可能であれば、ネストされた試合を避けたかったどの。

+5

あなたは 'as'を使うことができます:' Some({left = Some l; right = Some r}) ' – Lee

+0

@Lee、それはかなり近いです私は欲しいものを知りたいと思っていますが、nをunboxされた値にしたいと思います(例えば、 '| Some n - > n'の等価物ですが、与えた場合はnはxではなくSome xそれは意味をなさない? –

+0

'n'はレコード' {left = Some l;右=いくつかのr} ' - それはあなたが望むものではありませんか?申し訳ありませんが、私はOCamlを本当に知っていませんので、今自分で試してみることはできません。 – Lee

答えて

0

リーは、ソリューションがそうのように括弧でasを使用することで、上記のコメントで指摘したように:あなたが答えるために、私はあなたの信用を与えることができますしたい場合は

let rec remove_node root v = 
    match root with 
    | Some ({left = Some l; right = Some r} as n) -> dostuff... 

(@Lee、私は」 )

関連する問題