#ocaml
#ocaml
Вопрос:
Я хочу подсчитать, сколько «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>
Комментарии:
1. Не могли бы вы объяснить назначение аргументов
x
иy
функции? В частности, я не понимаю, зачем вам нужноy
(int), чтобы найти номер"u"
в списке. Разве сигнатура функции не должна бытьval count_u : string list -> int
?2. x — переданный список, y — возвращаемое число. Нам не разрешено создавать новые переменные, поэтому оно должно быть передано с вызовом функции.
Ответ №1:
У вас есть:
if List.length (List.hd x) == 0 then ...
Но это имеет смысл только в том случае, если x
это список списков. Your x
— это список строк.
Возможно, вам нужно именно это:
if List.length x = 0 then ...
В качестве дополнительного комментария оператор сравнения равенства в OCaml =
. ==
Оператор предназначен для особых случаев, и вы не должны использовать его без веской причины.
Комментарии:
1. Вы никогда не должны этого делать
List.length x = 0
, это O(len), в то времяmatch x with [] -> .. | _ -> ...
как это постоянное время.