我有一个尝试在OCaml中建模的数据库表。但是,当我尝试编写提取列的函数时遇到问题。我设法编写了一个仅包含一列的表的函数,但是如果我的表具有更多的列,则匹配失败。我需要有关如何在模式匹配中对表格进行命名的帮助。
(* Table with many columns *)
let tableWithManyColumns =
"carTable",
[ ("RegNumber", ["1";"2";"3";"4"]);
("Brand", ["BMW";"SAAB";"Volvo";"Jeep"]);
("Year",["2000";"2003";"2001";"2012"]);
];;
(*Table with one columns*)
let tableWithOneColumn = "carTable",
[
("RegNumber", ["1";"2";"3";"4"])
];;
(*Current extractColumn*)
let extractColumn (t:string * (string * string list) list) =
match t with
(a,[(b,c)])-> b;;
(* Returns Regnumber *)
extractColumn(tableWithOneColumn);;
(*Returns match failure*)
extractColumn(tableWithManyColumns);;
答案 0 :(得分:1)
模式[(b,c)]
与一个单身对对匹配。因此它将与[("hello", "world)]
匹配,但与[("hello", "world"); ("another", "pair")]
或[]
或长度不等于1的任何列表不匹配。如果要与长度超过一个的任何列表匹配,则需要使用first :: rest
模式,其中first
将与列表的第一个元素匹配,而rest
与列表的第一个元素匹配。其余部分(所有内容都超出第一个元素)。
以下函数将提取第一列的名称,
type column = string * string list (* name, values *)
type base = string * column list (* tableName, columns *)
let firstColumnName : base -> string = fun table -> match table with
| (_tableName, (columnName,_values) :: _otherColumns) -> columnName
| _ -> failwith "wrong table representation"
示例
# firstColumnName tableWithOneColumn;;
- : string = "RegNumber"
# firstColumnName tableWithManyColumns;;
- : string = "RegNumber"