У меня есть таблица базы данных, которую я пытался смоделировать в 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);;
Шаблон [(b,c)]
соответствует одноэлементному списку пар. Таким образом, он будет соответствовать [("hello", "world)]
, но не будет соответствовать [("hello", "world"); ("another", "pair")]
или []
или любому списку, длина которого не равна единице. Если вы хотите сопоставить любой список с длиной более единицы, вам нужно использовать шаблон 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"
Интересно, почему я должен читать код в таком формате? Если вы просите других о помощи, вы можете, по крайней мере, приложить немного усилий, чтобы сделать ее как можно проще.