Чтобы избежать путаницы с определением 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 элемента (потому что;
(title,[data])
относится к этому типу)
- список списка кортежей (потому что
(col,cont)::t
- это список кортежей, и, следовательно, [(col,cont)::t]
- это список списка кортежей, даже более того, это список из 1 элемента).
Компилятор предполагает, что a
имеет тип unit, а затем жалуется, потому что другие типы не являются типами unit.