В этой строке:
| x::xs when x=collecting -> temp xs collecting counted+1
компилятор интерпретирует ваш код как
| x::xs when x=collecting -> (temp xs collecting counted)+1
но вы хотите
| x::xs when x=collecting -> temp xs collecting (counted+1)
Однако, даже с этим изменением, одна проблема с вашим алгоритмом заключается в том, что функция temp
не является хвостовой рекурсией, что означает, что она может вызвать переполнение стека при вызове из длинного списка (например, при сбое countoccurences [1..10000]
моя машина). Если это важно для вас, то вам следует переписать вашу вспомогательную функцию temp
, чтобы она была хвостовой рекурсивной. Самый простой способ сделать это - добавить накопленный параметр списка и затем перевернуть список.
let countoccurences list =
match list with
| x::xs ->
let rec temp list collecting counted acc =
match list with
| x::xs when x = collecting -> temp xs collecting (counted+1) acc
| x::xs -> temp xs x 1 ((collecting, counted)::acc)
| [] -> (collecting, counted)::acc
temp xs x 1 []
|> List.rev
| [] -> []