Это выражение имеет тип string, но ожидалось выражение типа ‘список

#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 [] -> .. | _ -> ... как это постоянное время.