F #: Ошибка несоответствия типов при попытке подсчета количества строчных букв в строке - PullRequest
0 голосов
/ 27 сентября 2018

Итак, я пытаюсь посчитать количество строчных букв в строке.Вот так:

intput: "hello world"
output: 10

Вот что у меня есть:

let lowers (str : string) : int  = 
  let count  = 0
  for i=0 to (str.Length-1) do
    if (Char.IsLower(str.[i])) then (count = count+1)
    else count
  printf "%i" count

Но я продолжаю получать эту ошибку:

 All branches of an 'if' expression must have the same type. This expression was expected to have type 'bool', but here has type 'int'.

Я часами пыталсявыяснить эту проблему, но не продвинулись ни на шаг.Как я могу распечатать только значение счетчика, которое у меня есть?Там также написано:

expecting an int but given a unit

Пожалуйста, помогите

1 Ответ

0 голосов
/ 27 сентября 2018

В F # переменные неизменны по умолчанию.Это означает, что вы не можете присвоить им новое значение: count = count+1 не означает «взять значение count, добавить к нему 1 и присвоить это новое значение count», как это делается в других языках.Вместо этого оператор = (если он не является частью объявления let x = ...) - это оператор сравнение .Поэтому count = count+1 означает «true, если count равно count плюс один, или false, если два значения не равны».Конечно, это всегда ложь.

То, что вы пытаетесь сделать, назначая новое значение переменной, использует оператор <- и требует, чтобы переменная была объявлена ​​mutable first:

let mutable count = 0
count <- count + 1

Итак, ваш код должен выглядеть следующим образом:

let lowers (str : string) : int  = 
  let mutable count = 0
  for i=0 to (str.Length-1) do
    if (Char.IsLower(str.[i])) then count <- count+1
  count

Еще одна вещь, на которую стоит обратить внимание, это то, что я удалил строку else count.Обе стороны выражения if...then...else должны иметь один и тот же тип, а тип присваивания переменной - «нет типа», который F # называет unit по причинам, которые я здесь не буду использовать, так как лучше всего изучать что-то новое длясосредоточиться на одной концепции за один раз.Кроме того, существуют более эффективные способы (например, некоторые встроенные функции) для подсчета количества символов в строке, которые соответствуют определенному условию, но, опять же, по одному понятию за раз.

Обновление: Еще одно изменение, в котором нуждается ваш код, о котором я забыл упомянуть.Вы объявили вашу функцию lowers как возвращающую значение типа int, но последней строкой вашего исходного кода была printf "%d" count, которая возвращает «ничто» (тип, известный как unit).Вот откуда возникла ошибка «ожидая int, но с учетом единицы измерения».Чтобы вернуть значение count, последняя строка вашего кода должна быть просто count: возвращаемое значение функции F # - это значение последнего выражения в функции .Здесь это значение count, поэтому последним выражением в функции должна была быть строка с простым текстом count, чтобы оно стало возвращаемым значением функции.

...