匹配ocaml中的复杂数据类型

时间:2018-04-29 11:14:59

标签: pattern-matching ocaml

匹配以下数据时

this.setState(prevState => ({
  product: { ...prevState.product, ingredients: prevState.product.ingredients.filter(...) },
}));

使用此模式

let atable = ("Student", [("Id", ["2";"4";"7";"9"]);
                          ("Name", ["Jim";"Linnea";"Steve";"Hannah"]);
                          ("Gender",["Male";"Female";"Male";"Female"]);
                          ("Course",["Geography";"Economics";"Informatics";"Geography"])
                         ]);; 

我收到一个错误,告诉我代码正在尝试匹配' a *' b的值,但该模式期望匹配类型unit的值。这有什么不对?

1 个答案:

答案 0 :(得分:3)

为避免与atable的定义混淆,您希望编写的printTable代码如下:

let rec printTable a = match a with
     ( )->""
   | (title,[data]) -> "\n"^title^"\n\n"^printTable(data)
   | [(col,cont)::t] -> col^"   "^printTable([t])

其中a是函数的参数。

关注syntax of pattern matching:“表达式expr与各种模式p1,...,pn顺序匹配。如果其中一个模式(例如pi)与expr的值一致,那么相应的计算分支(expri)被评估。各种模式pi是相同类型的。“

在您的情况下,您打算将表达式a与3种不同类型匹配:

  1. unit()
  2. 由某个元素组成的元组和1个元素的列表(因为; (title,[data])属于该类型)
  3. 元组列表的列表(因为(col,cont)::t是元组列表,因此[(col,cont)::t]是元组列表的列表,更多这是1个元素的列表。)< / LI>

    编译器假定a的类型为unit,然后抱怨,因为其他类型不是单元类型。