Внутренние функции с SML NJ - PullRequest
       18

Внутренние функции с SML NJ

3 голосов
/ 22 февраля 2012

Я новичок в sml и у меня проблемы с синтаксисом внутренних функций. Что мне нужно сделать, это взять список из списка целых, усреднить каждый список, и вернуть список реалов. Это код psuedo-ish, который у меня есть.

 fun listAvg [] = 0  
    else (sum (x) div size (x))

        fun sum[] = 0
        | sum(head::rest)= head + sum rest;


        fun size [] = 0
        | size(head::rest) = 1 + size rest;

    listAvg([[1,3,6,8,9], [4,2,6,5,1], [9,5,9,7], [5,4], [3,6,4,8]]); 

любой совет будет принята с благодарностью. Спасибо!

1 Ответ

6 голосов
/ 22 февраля 2012

Используйте 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 для применения функции к элементам, идущим вниз по списку, вместе со значением аккумулятора для генерации одного значения. Возможно, вы сможете использовать эти две функции для создания одного длинного списка всех чисел, которые затем сможете усреднить.
...