OCaml中的记录类型模式匹配

17

我正在尝试使用模式匹配来编写一个计算器应用程序。

以下是定义的两种主要类型:

type key = Plus | Minus | Multi | Div | Equals | Digit of int;;

type state = {
    lcd: int; (* last computation done *)
    lka: key; (* last key actived *)
    loa: key; (* last operation actived *)
    vpr: int (* value print on the screen *)
};;

let print_state s =
    match s with
     state (a,_,_,d) -> print_int a; //Here has the compile error
                print_newline();
                print_int d;
                    print_newline();;

然而,如果我的状态是这样的:

let initial_state = { lcd=0; lka=Equals; loa=Equals; vpr=0 } ;; 

那么当我调用这个函数时:

print_state initial_state;;

它将会有编译错误。有人可以告诉我编译失败的原因吗?谢谢。

Error: Syntax error
unexpected token "("

2
但是你为什么要在记录上进行模式匹配呢?要从“initial_state”中获取“lcd”,请使用“initial_state.lcd”。 - ben
1个回答

36

记录模式看起来像一条记录:

match s with
| { lcd = a; vpr = d; _ } -> (* Expression *)

9
在现代的OCaml中,如果你用与标签相同的方式命名变量,你也可以跳过=部分:match s with {lcd; vpr; _ } -> print_int lcd; print_int vpr - lukstafi
2
补充luksatfi的评论,实际上根本不需要使用match语句。let print_state {lcd; vpr; _} = ...就足够了。 - rgrinberg
在谷歌搜索之前,我尝试了另一种方式({a = lcd...),这种方式对我来说更自然,但是好吧,至少有一种方法。感谢您的答案,也感谢@yjasrc提出这个问题。 - Tatiana Racheva
在我的情况下,我有一个匹配语句,因为它是一个结果类型。我不喜欢未命名的变量,所以我更喜欢{lcd; vpr; lka = _lka; loa = _loa;}。如果有许多字段,则可能会有所不同,但如果只有少数字段,则在阅读代码时查看其他可用内容更有趣,即使当前未使用这些字段。 - Tatiana Racheva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接