соответствовать сложному типу данных в ocaml - PullRequest
0 голосов
/ 29 апреля 2018

При сопоставлении данных ниже

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. Что здесь не так?

1 Ответ

0 голосов
/ 29 апреля 2018

Чтобы избежать путаницы с определением atable, код printTable, который вы хотите написать, следующий:

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

где a - аргумент вашей функции.

После синтаксиса сопоставления с образцом : "Выражение выражения последовательно сопоставляется с различными образцами p1, ..., pn. Если один из образцов (например, pi) соответствует значению expr, тогда вычисляется соответствующая ветвь вычисления (expri). Различные шаблоны pi относятся к одному типу. "

В вашем случае вы намереваетесь сопоставить выражение a с тремя различными типами:

  1. единица ()
  2. кортеж из чего-то и список из 1 элемента (потому что; (title,[data]) относится к этому типу)
  3. список списка кортежей (потому что (col,cont)::t - это список кортежей, и, следовательно, [(col,cont)::t] - это список списка кортежей, даже более того, это список из 1 элемента).

Компилятор предполагает, что a имеет тип unit, а затем жалуется, потому что другие типы не являются типами unit.

...