用于评估 SML 中的方程式的 Curried 函数
Curried function for evaluating an equation in SML
我需要解决的确切问题如下。
基本上,我得到了一个代表系数的实数列表。第一个元素是常数值,后面是多项式方程的系数。因此,eval[1.0, 5.0, 3.0] 2.0 将构造方程“1 + 5x + 3x^2”并在 2.0 处计算它,得到 23.0。该函数需要是 "real list -> real -> real".
类型
现在,我需要做的是使用柯里化函数在 SML 中实现 eval,这样它就在一行中,并且没有递归调用。我已经完成了递归方式并理解了这一点,但是我在用柯里化方式思考问题时遇到了麻烦。我们需要使用 map、foldr 和 foldl 等函数来完成此操作,以及匿名功能。我对此的想法是让函数获取列表并只获取它的尾部(除了头部元素,这是常量),并使用 foldl 对其进行评估。我 运行 遇到的问题是我不确定这是否可能,或者如何通过跟踪我已经进入列表的程度(计数器)来实现这一点,以便我可以正确使用他们的权力。
如有任何帮助,我们将不胜感激。
考虑到 fold 函数,list 数据结构和 tail-recursion 是交织在一起的, 如果您已经有了尾递归解决方案,则可以轻松提出基于折叠的解决方案。
计算多项式的问题可以使用实现 horners 方法的递归函数来解决:
fun eval [] _ = 0.0
| eval (y :: ys) x = y + x*(eval ys x)
该函数可以很容易地转换为尾递归函数,之后应该会出现使用 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 调用匿名函数并产生结果,即计算的多项式的值。
我需要解决的确切问题如下。
基本上,我得到了一个代表系数的实数列表。第一个元素是常数值,后面是多项式方程的系数。因此,eval[1.0, 5.0, 3.0] 2.0 将构造方程“1 + 5x + 3x^2”并在 2.0 处计算它,得到 23.0。该函数需要是 "real list -> real -> real".
类型现在,我需要做的是使用柯里化函数在 SML 中实现 eval,这样它就在一行中,并且没有递归调用。我已经完成了递归方式并理解了这一点,但是我在用柯里化方式思考问题时遇到了麻烦。我们需要使用 map、foldr 和 foldl 等函数来完成此操作,以及匿名功能。我对此的想法是让函数获取列表并只获取它的尾部(除了头部元素,这是常量),并使用 foldl 对其进行评估。我 运行 遇到的问题是我不确定这是否可能,或者如何通过跟踪我已经进入列表的程度(计数器)来实现这一点,以便我可以正确使用他们的权力。
如有任何帮助,我们将不胜感激。
考虑到 fold 函数,list 数据结构和 tail-recursion 是交织在一起的, 如果您已经有了尾递归解决方案,则可以轻松提出基于折叠的解决方案。
计算多项式的问题可以使用实现 horners 方法的递归函数来解决:
fun eval [] _ = 0.0
| eval (y :: ys) x = y + x*(eval ys x)
该函数可以很容易地转换为尾递归函数,之后应该会出现使用 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 调用匿名函数并产生结果,即计算的多项式的值。