У меня есть набор проблем, с которыми я работал, и не могу понять, что спрашивает последний. Вот первая проблема, и мое решение ему:Накопительная функция 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?