Ocaml: рекурсия по списку кортежей - PullRequest
2 голосов
/ 16 мая 2019

У меня есть следующая таблица функций, которая принимает список кортежей (x - строки, а y - список строк), и я хочу вернуть кортеж x1 и длину списка y1. Я попробовал это с этой простой функцией:

let rec table lst = function
    | [] -> []
    | [(x1, y1, x2, y2)] -> [(x1, (List.length y1))]
    | (x1_h, y1_h, x2_h, y2_h) :: tail -> (x1_h, (List.length y1_h))::(table tail)

Но произошла следующая ошибка:

Ошибка: это выражение имеет тип ('a *' b list * 'c *' d) список -> ('a * int) список но ожидалось выражение типа ('a * int) list

Я не совсем уверен, что я там не так сделал.

1 Ответ

5 голосов
/ 17 мая 2019

function принимает аргумент неявно и соответствует шаблону.Другими словами:

let f = function | ...

эквивалентно

let f lst = match lst with | ...

Поэтому, когда вы пишете

let rec table lst = function | ...

Это означает

let rec table lst lst2 = match lst2 with | ...

Ошибка указывает на рекурсивный вызов table tail, поскольку он применяется частично и возвращает функцию ('a * 'b list * 'c * 'd) list -> ('a * int).table tail tail вернет ('a * int list), как и ожидалось, и является полностью действительным.Но поскольку lst не используется в вашей функции, вы можете просто удалить его.

...