Обозначить список для извлечения частей - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть таблица базы данных, которую я пытался смоделировать в 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 Ответ

1 голос
/ 08 апреля 2019

Шаблон [(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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...