Используйте let, как в
fun listAvg [] = 0
| listAvg x =
let
fun sum[] = 0
| sum(head::tail)= head + sum tail;
fun size [] = 0
| size(head::tail) = 1 + size tail;
in
(sum x) div (size x)
end
Вы должны передать int list
этой функции, например,
listAvg [1, 2, 3, 4];
Это не изменит ваш код, за исключением изменения порядка и размещения ключевых слов let
, in
и end
. Если это не домашнее задание, я бы рекомендовал использовать несколько встроенных стандартных библиотечных функций в структуре List
, которые могли бы уменьшить эту функцию до двух строк, включая сопоставление с образцом в пустом списке.
EDIT
Есть два возможных значения «усреднить список из списка целых». Первый - это усреднить каждый список, а затем взять среднее из средних значений, а второй - объединить списки в один длинный список и взять среднее по всему списку. Оба метода эквивалентны (за исключением ошибок округления), когда все списки целых имеют одинаковую длину, но, как показывает ваш пример, они не обязательно должны быть одинаковой длины.
Поскольку это домашнее задание, я не собираюсь давать вам ответ напрямую, но рассмотрим следующее, которое может быть полезным:
- Если вы используете первую интерпретацию «усредните список из списка целых:», есть встроенная функция SML, которая позволит вам применить другую функцию к каждому элементу списка и получить результирующий список , Это может быть полезно для получения индивидуальных средних значений, которые затем можно объединить в общее среднее значение.
- Если вы используете вторую интерпретацию: есть встроенная функция SML (она выглядит как оператор, но многие вещи, которые выглядят как операторы в SML, являются просто инфиксными функциями) для объединения двух списков вместе, и встроенная функция SML для применения функции к элементам, идущим вниз по списку, вместе со значением аккумулятора для генерации одного значения. Возможно, вы сможете использовать эти две функции для создания одного длинного списка всех чисел, которые затем сможете усреднить.