В 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
, чтобы оно стало возвращаемым значением функции.