Одна из проблем заключается в том, что вы возвращаете два разных типа: int для пустого списка или кортеж в противном случае. Это должно быть одно или другое.
Другая проблема заключается в том, что вы пытаетесь добавить 1 к test
, но test
- это функция, а не значение. Вам нужно вызвать test для чего-то еще, чтобы он вернул значение, но даже в этом случае он должен вернуть кортеж, который вы не можете добавить к целому числу.
Я не могу понять, что вы хотите от кода, но если вы обновите свой вопрос этой информацией, я могу помочь больше.
Я предполагаю, что вы хотите посчитать положительные числа в списке, и в этом случае вы можете написать это так:
let rec test l =
match l with [] -> 0
| x::xs -> if x > 0 then 1 + (test xs)
else test xs;;
Обновление: поскольку вы отредактировали, чтобы прояснить проблему, измените приведенный выше код следующим образом:
let test l =
let rec test_helper l pos nonpos =
match l with [] -> (pos, nonpos)
| x::xs -> if x > 0 then test_helper xs 1+pos, nonpos
else test_helper xs pos 1+nonpos
in test_helper l 0 0;;
В этом случае очень помогает использование аккумуляторов. Это также делает функцию хвостовой рекурсивной, что всегда является хорошей практикой.
person
danben
schedule
15.06.2010