创建一个 returns 柯里化函数的函数 (SML)
Creating a function that returns a curried function (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];
它会给我一个与上面的功能等效的功能。
这可能吗?
我知道这看起来微不足道,我可以像以前一样在此处放一个 x 并继续我的生活。但我很好奇有人会如何解决这个问题!
提前致谢,夏兰
编辑:
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;
可爱!
如果我正确理解你的问题,那么你根本不需要定义任何其他内容。使用您拥有的功能poly
,您已经可以做到
val f = poly [3.0, 2.0, 1.0]
将 f
定义为类型 real -> real
的函数。
我编写了一个函数来计算由实数列表构成的多项式的 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];
它会给我一个与上面的功能等效的功能。 这可能吗? 我知道这看起来微不足道,我可以像以前一样在此处放一个 x 并继续我的生活。但我很好奇有人会如何解决这个问题!
提前致谢,夏兰
编辑:
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;
可爱!
如果我正确理解你的问题,那么你根本不需要定义任何其他内容。使用您拥有的功能poly
,您已经可以做到
val f = poly [3.0, 2.0, 1.0]
将 f
定义为类型 real -> real
的函数。