Это выражение имеет строку типа, но ожидалось выражение типа 'список - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу посчитать, сколько "ты" в списке.Примером вызова функции может быть

     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);; 

Я понимаю, почему у меня проблема.Окамл хочет получить список, но поскольку я сравниваю его со строкой, он превращается в строку.Это также рассердится, когда я вспомню countu с y + 1, потому что, опять же, он хочет неуказанную единицу вместо целого числа.Как мне обойти это.Я хочу, чтобы подпись выглядела как

val countups : string list * int -> int = <fun>

1 Ответ

1 голос
/ 09 апреля 2019

У вас есть:

if List.length (List.hd x) == 0 then ...

Но это имеет смысл, только если x является списком списков.Ваш x - это список строк.

Возможно, вам нужно именно это:

if List.length x = 0 then ...

В качестве дополнительного комментария оператор сравнения равенства в OCaml равен =.Оператор == предназначен для особых случаев, и вы не должны использовать его без уважительной причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...