表示提取零件的列表

时间:2019-04-08 16:17:33

标签: list ocaml

我有一个尝试在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);;

1 个答案:

答案 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"