Основная проблема в том, что, похоже, вы пытаетесь присвоить новое значение для i
внутри теста в цикле while
, но оператор =
проверяет равенство и не выполняет присваивание.Оператор присваивания <-
имеет тип возврата unit
(он не возвращает назначенное значение), поэтому исправление не может быть таким простым, как замена вызова на =
вызовом на <-
.
Самым простым решением, вероятно, является разбиение этого теста на отдельную внутреннюю функцию:
let counter (text : string) (pattern : string) =
let mutable i = 0
let moveNext() =
i <- text.IndexOf(pattern, i)
i
let mutable count = 0
while (moveNext() >= 0) do
i <- i + pattern.Length
count <- count + 1
count
Однако обратите внимание, что это не идиоматический код F #.Вместо этого я бы написал так:
let counter (text : string) (pattern : string) =
let rec countFrom (i:int) total =
match text.IndexOf(pattern, i) with
| j when j >= 0 -> countFrom (j+pattern.Length) (total+1)
| _ -> total
countFrom 0 0