【问题标题】:match complex datatype in ocaml匹配 ocaml 中的复杂数据类型
【发布时间】:2018-05-02 00:29:05
【问题描述】:

同时匹配下面的数据

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

这种模式

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

我收到一条错误消息,告诉我代码正在尝试匹配 'a * 'b 类型的值,但模式期望匹配 unit 类型的值。这里有什么问题?

【问题讨论】:

  • 我认为这是the XY problem 的情况。为什么你的学生首先由一个字符串的元组和一个表示键和值的元组数组来表示?使用更合适的数据结构而不是解决模式匹配问题可能会更好。
  • 我倾向于同意 RichouHunter 的观点。我宁愿看到: type student = {id: string;名称:字符串;性别:字符串;课程:字符串};;作为基本类型,并且 atable 将只是一个 student 列表。但这取决于您想要实现的目标。
  • @PierreG.这只是表格的一个例子。我的任务是创建一个通用表数据类型,并使用模式匹配和递归在其上实现 3 个函数。

标签: pattern-matching ocaml


【解决方案1】:

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

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

a 是函数的参数。

Following syntax of pattern matching : "表达式 expr 依次匹配各种模式 p1, ..., pn。如果其中一个模式(例如 pi)与 expr 的值一致,则相应的计算分支 ( expri) 被评估。各种模式 pi 属于同一类型。"

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

  1. 单位()
  2. 由某物和一个包含 1 个元素的列表组成的元组(因为 ;(title,[data]) 属于那种类型)
  3. 元组列表的列表(因为(col,cont)::t是元组列表,因此[(col,cont)::t]是元组列表,更何况这是1个元素的列表)。

编译器假定a 是单元类型,然后报错,因为其他类型不是单元类型。

【讨论】:

  • 哦,我明白了。现在我很困惑,就像案例 1 一样,即我想将输入与空元组匹配的基本案例。我该如何表述?
  • 根据定义,元组不能为空 ;)
  • 提醒一下,元组是笛卡尔积。例如:整数元组 (4,3),然后不能为空。我希望它澄清。
  • 好的,谢谢。这听起来很合理。如何编写一个基本案例,例如与 [] 匹配的列表?
猜你喜欢
  • 2015-05-28
  • 2019-03-27
  • 2020-01-29
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 2013-06-14
  • 2016-01-17
  • 1970-01-01
相关资源
最近更新 更多