Причиной ошибки типа является то, что функция должна возвращать пару, но ваши базовые случаи не возвращают.
Я подозреваю, что вы добрались до этого кода, подумав о пропуске каждого другого элемента, разделив списокпропуская.
Есть другой способ приблизиться к этому.
Рассмотрим список [a,b,c,d]
.
Считая от 1, элементы пронумерованы
1 2 3 4
a b c d
Теперь рассмотрим позиции в хвосте списка.
Это
1 2 3
b c d
То есть нечетные позиции в хвосте - это четные позиции во всем списке и четные позиции в хвосте.нечетны во всем списке.
Это означает, что если мы будем рекурсивно вычислять «шансы и четности» в хвосте, мы получим суммы из хвоста, где его «шансы» - наши «четности», иесли мы добавим нашу голову к «четкам» хвоста, мы получим «шансы», которые мы хотим.
Все, что нам сейчас нужно, это хороший базовый случай - и суммы пустого списка должны быть (0, 0)
.
Примерно так:
fun add [] = (0,0)
| add (x::xs) = case add xs of
(odds, evens) => (x + evens, odds)
или, йовы можете деконструировать рекурсивный результат с помощью let
-связи вместо case
:
fun add [] = (0,0)
| add (x::xs) = let val (odds, evens) = add xs
in
(x + evens, odds)
end