Jeden problem polega na tym, że zwracasz dwa różne typy: int dla pustej listy lub krotkę w inny sposób. Musi to być jedno lub drugie.
Innym problemem jest to, że próbujesz dodać 1 do test
, ale test
to funkcja, a nie wartość. Musisz wywołać test na czymś innym, aby zwrócił wartość, ale nawet wtedy powinien zwrócić krotkę, której nie możesz dodać do liczby całkowitej.
Nie mogę określić, co ma zrobić kod, ale jeśli zaktualizujesz pytanie o te informacje, mogę pomóc.
się domyślać, że mam to, że chcesz liczyć na pozytywne numery na liście, w którym to przypadku można napisać tak:
let rec test l =
match l with [] -> 0
| x::xs -> if x > 0 then 1 + (test xs)
else test xs;;
Aktualizacja: odkąd edytowane w celu wyjaśnienia problem, zmień powyższy kod w następujący sposób:
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;;
Korzystanie z akumulatorów bardzo pomaga w tym przypadku. Powoduje także funkcję rekursywną, która jest zawsze dobrą praktyką.
Czy możesz podać więcej szczegółów na temat funkcji, która ma powrócić? Co oznacza para liczb całkowitych? – goggin13
, więc powinien zwrócić parę liczb całkowitych jako (x, y), która jest krotką w ocaml , że jedynym problemem, z którym się spotkałem, jest obliczenie krotki .. tak to jest, jeśli element listy jest mniejszy niż pewna liczba (x +1, y) else (x, y + 1), więc zwracana wartość będzie (x, y), gdzie x to liczba elementów większa od pewnej liczby, a y jest mniejsza niż – REALFREE