Я хочу подсчитать, сколько «u» в списке. Примером вызова функции может быть
countu(["u"; "a"; "x"], 0);;
:-int = 1
Код у меня есть
let rec countu = fun(x, y) ->
if List.length (List.hd x) == 0 then y
else if List.hd x == "u" then countu(List.tl x, y+1)
else countu(List.tl x, y);;
Я понимаю, почему у меня проблемы. Ocaml хочет список, но поскольку я сравниваю его со строкой, он делает его строкой. Он также разозлится, когда я вспомню countu с y+1, потому что, опять же, ему нужна неуказанная единица измерения вместо целого числа. Как мне обойти это. Я хочу, чтобы подпись выглядела как
val countups : string list * int -> int = <fun>
x — переданный список, y — возвращаемый номер. Нам не разрешено создавать новые переменные, поэтому их нужно передавать при вызове функции.
У тебя есть:
if List.length (List.hd x) == 0 then ...
Но это имеет смысл только в том случае, если x
— это список списков. Ваш x
— это список строк.
Возможно, вы хотите только это:
if List.length x = 0 then ...
В качестве побочного комментария оператор сравнения на равенство в OCaml — это =
. Оператор ==
предназначен для особых случаев, и вы не должны использовать его без веской причины.
Вы никогда не должны делать List.length x = 0
, это O (len), а match x with [] -> .. | _ -> ...
— постоянное время.
Не могли бы вы объяснить назначение аргументов
x
иy
функции? В частности, я не понимаю, зачем вам нужноy
(int), чтобы найти число"u"
в списке. Разве сигнатура функции не должна бытьval count_u : string list -> int
?