SML中方程求值的通用函数

SML中方程求值的通用函数,sml,Sml,我需要解决的确切问题如下 基本上,我得到了一个实数列表,表示系数。第一个元素是常数值,紧随其后的是多项式方程的系数。因此,eval[1.0,5.0,3.0]2.0将构建方程“1+5x+3x^2”,并将其评估为2.0,结果为23.0。该函数需要为“实际列表->实际->实际”类型 现在,我需要做的是使用一个curried函数在SML中实现eval,这样它就都是一行,并且没有递归调用。我已经用递归的方式做了,并且理解这一点,但是我很难用咖喱的方式来表达我的想法。我们需要使用map、foldr和fold

我需要解决的确切问题如下

基本上,我得到了一个实数列表,表示系数。第一个元素是常数值,紧随其后的是多项式方程的系数。因此,eval[1.0,5.0,3.0]2.0将构建方程“1+5x+3x^2”,并将其评估为2.0,结果为23.0。该函数需要为“实际列表->实际->实际”类型

现在,我需要做的是使用一个curried函数在SML中实现eval,这样它就都是一行,并且没有递归调用。我已经用递归的方式做了,并且理解这一点,但是我很难用咖喱的方式来表达我的想法。我们需要使用map、foldr和foldl等函数以及匿名函数来实现这一点。我的想法是让函数获取列表并只获取其尾部(除了head元素,它是常量),然后使用foldl对其进行求值。我遇到的问题是,我不确定这是否可能,或者如何通过跟踪我已经进入列表(计数器)的程度来实现这一点,以便我能够正确地使用他们的能力

如果您有任何帮助,我们将不胜感激。

考虑到折叠函数、列表数据结构和尾部递归是相互交织的,如果您已经有了尾部递归解决方案,您可以很容易地提出基于折叠的解决方案

计算多项式的问题可以使用实现horners方法的递归函数来解决:

该函数可以很容易地转换为尾部递归函数,之后应该出现使用foldr的解决方案:

fun eval ys x = foldr (fn (y,a) => y + x*a) 0.0 ys
那么foldr在这里是如何工作的呢

给定一个系数列表,
[y0,y1,y2,y3]
,表示以下多项式
f(x)=y0+y1*x+y2*x^2+y3*x^3

foldr将匿名函数
fn(y,a)=>y+x*a
应用于 逐步列出系数。它从右到右处理列表 左边它将中的系数y作为其第一个参数 以下顺序(先是y3,然后是y2,然后是y1,最后是y0)

第二 参数a不包含评估的临时结果。参数a通常称为累加器。弗斯特 它是用
0.0
初始化的。在下一步,累加器保持
y3*x
的值。然后累加器保存
y2*x+y3*x^2
。在此之后,它将保存值
y1*x+y2*x^2+y3*x^3
。最后,使用系数y0调用匿名函数,并生成结果,即求值多项式的值。

您能帮我理解您发布的第二个变量吗?这正是我所需要的,而且有效!我似乎无法理解匿名函数。当我看到这一点时,我想象它每次会为列表中的两个元素创建一个配对,这将导致多个“常量”。比如(0,1),然后(2,3),(4,5),而配对中的每个第一个元素都将被视为常量。您尝试过什么代码?
fun eval ys x = foldr (fn (y,a) => y + x*a) 0.0 ys