smlnj - функция, которая добавляет четные и нечетные элементы в список Int - PullRequest
0 голосов
/ 04 октября 2018

Я довольно новичок в функциональном программировании, и я не понимаю мою ошибку здесь.Я пытаюсь создать функцию, которая принимает список целых чисел и возвращает как сумму четных элементов, так и сумму нечетных элементов.Ошибка, которую я получаю, находится в строке 1 и гласит: «Ошибка: правая часть предложения не соответствует типу результата функции [конфликт перегрузки] ...».Я не понимаю ошибку, и я был бы признателен за любую помощь в понимании моей ошибки.

fun add(nil) = 0
|   add([x]) = x
|   add(x :: xs) =
        let
            val evenList = xs;
            val oddList = x :: xs
        in
            (hd evenList + add(tl(tl(evenList))), hd oddList + add(tl(tl(oddList))))
        end;

1 Ответ

0 голосов
/ 04 октября 2018

Причиной ошибки типа является то, что функция должна возвращать пару, но ваши базовые случаи не возвращают.

Я подозреваю, что вы добрались до этого кода, подумав о пропуске каждого другого элемента, разделив списокпропуская.

Есть другой способ приблизиться к этому.

Рассмотрим список [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
...