2013-09-27 4 views
0

У меня есть набор проблем, с которыми я работал, и не могу понять, что спрашивает последний. Вот первая проблема, и мое решение ему:Накопительная функция Curried (SML)

а) Часто мы заинтересованы в вычислении Е я = м .. п   е (я), сумма значений функции е (я) для я = м - n. Определить sigma f m n, который вычисляет Σ я = м .. н  ф (я). Это отличается от определения sigma (f, m, n).

fun sigma f m n = if (m=n) then f(m) else (f(m) + sigma f (m+1) n); 

Вторая проблема, и мое решение:

б) При вычислении сигмы выше, индекс я иду от текущего я к следующему значению я + 1. Мы можем вычислить сумму f (i), где i переходит от текущего i к следующему, например i + 2, а не i + 1. Если мы отправим эту информацию в качестве аргумента, мы можем вычислить более обобщенное суммирование . Определите 'sum f next m n' для вычисления такого суммирования, где 'next' - это функция для вычисления следующего значения индекса из текущего значения индекса . Чтобы получить 'sigma' в (a), вы отправите преемника как функцию «next».

fun sum f next m n = if (m>=n) then f(m) else (f(m) + sum f (next) (next(m)) n); 

И третья проблема, с моей попытки:

с) Обобщая сумму в (б), можно вычислить не только суммирование, но и продукт и другие формы накопления. Если мы хотим вычислить сумму в (b), мы отправляем добавление в качестве аргумента; если мы хотим вычислить произведение значений функций, мы отправляем умножение в качестве аргумента для того же параметра. Мы также должны отправить личность оператора . Определите 'accum h v f next m n' для вычисления такого накопления, где h - функция с двумя переменными для накопления, а v - базовое значение для накопления. Если мы посылаем функцию умножения для ч, 1 для V, и функцию преемника как 'следующий', это 'Accum' вычисляет П я = м .. п   е (i).Создайте примеры, чье «h» не является дополнением, а также умножением .

fun accum h v f next m n = if (m>=n) then f(m) else (h (f(m)) (accum (h) (v) (f) (next) (next(m)) n)); 

В задаче C, я не уверен, что я предполагаю, чтобы сделать с моим «V» аргумент. Прямо сейчас функция примет любой интервал чисел m - n и применит к ним любую операцию. Например, я мог бы позвонить своей функции

accum mult (4?) double next3 1 5; 

где double - функция удвоения, а next3 добавляет 3 к заданному значению. Любые идеи о том, как я поддерживаю значение v?

ответ

0

Этот набор проблем предназначен для реализации функции накопления. Он принимает

  • h - сочетает в себе предыдущее значение и текущее значение для получения следующего значения
  • v - начальное значение для h
  • f - функция, которая будет применяться к значениям из [m, n) интервала перед передачей их h функции
  • next - вычисляет следующее значение в последовательности
  • m и n - Границы

Вот как я определил бы accum:

fun accum h v f next m n = if m >= n then v else accum h (h (f m) v) f next (next m) n 

Примеры, которые были описаны в C будет выглядеть следующим образом:

fun sum x y = x + y; 
fun mult x y = x * y; 
fun id x = x; 

accum sum 0 id next 1 10; (* sum [1, 10) staring 0 *) 
accum mult 1 id next 1 10; (* prod [1, 10) starting 1 *) 

Например, вы можете вычислить сумму цифр от 1 до 10 и плюс 5, если вы пройдете 5 как v в первом примере.

0

Инструкции будут иметь больше смысла, если вы рассмотрите возможность пустой интервал.

  • "сумма" из одного значения п является п. Сумма значений no равна нулю.
  • «Продукт» одного значения n is n. Продукт нет значений один.
  • Список одного значения n является [n] (n::nil). Список нет значениями являются nil.

В настоящее время, Вы предполагаете, что м   ≤   н и лечения м   =   п как частный случай, который возвращает f m. Другим подходом является обработка m   >   n как специальный случай, возвращающий v. Затем, когда м   =   п, ваша функция будет автоматически возвращать h v (f m), который является таким же, как (f m) (при условии, что v был выбран правильно для этого ч).

Чтобы быть честным, хотя, я думаю, что v -Меньше подход хорошо, когда аргументы функции указать интервал вида [м, п], так как нет никакой логической причины, что такая функция будет поддерживать пустой интервал. (Я имею в виду, [м, м − 1] не так много «пустой интервала», как это «явная ошибка»). В v -ful подхода в основном полезен, когда аргументы функции указать список или набор элементов в некотором роде, что действительно может предположительно быть пустым, например как 'a list.

Смежные вопросы