Создание функции, возвращающей каррированную функцию (SML)

Я написал функцию, которая вычисляет значение x многочлена, составленного из списка вещественных чисел.

infixr 5 ^^;

fun (x:real) ^^ 0 = 1.0
  | (x:real) ^^ n = x*(x^^(n-1));

fun poly [] (x:real) = 0.0
  | poly (hd::tl) (x:real) = hd*(x^^(length tl)) + poly tl x;

Этот код отлично работает, и я очень горжусь этим.

Мне удалось создать полиномиальные функции, используя частичное приложение:

> fun f x = poly [3.0,2.0,1.0] x;
val f = fn : real -> real

> f 2.0;
val it = 17.0 : real

Создание математической функции:f(x) = 3*x^2 + 2*x + 1

Это все хорошо, но я хочу иметь возможность построить функцию с помощью этого метода:

fun f x = polyGen [1.0,2.0,3.0];

И это даст мне функцию, эквивалентную приведенной выше. Это возможно? Я знаю, что это кажется тривиальным, я мог бы просто поставить там крестик, как делал раньше, и жить дальше. Но мне просто любопытно, как кто-то решит эту проблему!

Заранее спасибо, Киаран

РЕДАКТИРОВАТЬ:

fun polyGen L = let fun poly [] x = 0.0
                      | poly (hd::tl) x = hd + x*(poly tl x);
                in fn x => poly L x end;

Прекрасный!


person user2930356    schedule 24.01.2017    source источник


Ответы (1)


Если я правильно понял ваш вопрос, то вам вообще ничего не нужно определять. С имеющейся у вас функцией poly вы уже можете это сделать

val f = poly [3.0, 2.0, 1.0]

который определяет f как функцию типа real -> real.

person Andreas Rossberg    schedule 24.01.2017