【问题标题】:Pattern match on records with option type entries in OCamlOCaml 中具有选项类型条目的记录的模式匹配
【发布时间】:2015-06-25 20:43:15
【问题描述】:

基本上我已经定义了这样的记录类型:

and exp = Bil_t.exp = {
  var: var option;
  binop: binop option;
  load: load option;
  store: store option;
  cast: cast option;
  inte: inte option;
  let_exp: let_exp option
}

我正在考虑使用模式匹配来处理它,如下所示:

match rexp with
    | {None;binop;None;None;None;None;None} -> trans_binop @@ strip binop
    | {var;None;None;None;None;None;None} -> BU.inte_to_string @@ strip @@ mark inte
    | _ -> failwith "undefined"

抱歉上面的代码乱七八糟。所以基本上我编译了上面的代码,我得到了错误:

Error: Syntax error

谁能给我一些帮助。我只是不知道这里出了什么问题...

【问题讨论】:

    标签: pattern-matching ocaml


    【解决方案1】:

    记录模式需要包含字段名称。

    type exp = {
      var: int option;
      binop: int option;
      load: int option;
      store: int option;
      cast: int option;
      inte: int option;
      let_exp: int option
    }
    
    let f rexp =
        match rexp with
        | { var = None; binop = Some b; load = None; store = None;
            cast = None; inte = None; let_exp = None
          } -> b
        | _ -> failwith "undefined"
    

    例子:

    # let r = { var = None; binop = Some 14; load = None; store = None; 
                cast = None; inte = None; let_exp = None };;
    val r : exp =
      {var = None; binop = Some 14; load = None; store = None; cast = None;
       inte = None; let_exp = None}
    # f r;;
    - : int = 14
    

    【讨论】:

    • 作为一个小附录,您可以删除 value 模式{var; binop; load; store; cast; inte; let_exp}。这将为您提供一组名为varbinop 等的绑定变量。当然,这不是您的代码所需要的,但仅供参考。
    • 是的,很多时候这是一个有用的缩写,值得了解。不用写{ a = a; b = b },你可以写{ a; b }
    • @antron,谢谢你。但是据我了解,这7个变量的选项还是要勾选的,对吧?
    • 是的,如果你想看看你得到的值是否是None,你必须做额外的检查。最好直接在模式中完成,就像 Jeffrey Scofield 的回答一样。我的评论仅适用于您只想将名称绑定到记录字段,而不需要对值的结构进行模式匹配。您还必须接受与记录字段同名的变量。
    猜你喜欢
    • 2013-06-14
    • 2011-10-29
    • 1970-01-01
    • 2016-01-17
    • 2021-12-13
    • 1970-01-01
    • 2018-08-19
    • 2018-03-16
    • 2015-05-28
    相关资源
    最近更新 更多