霍纳规则用于简化在特定变量值下评估多项式的过程。https://rosettacode.org/wiki/Horner%27s_rule_for_polynomial_evaluation#Standard_ML
我已经使用 SML 轻松地将该方法应用于单变量多项式,表示为 int 列表:
fun horner coeffList x = foldr (fn (a, b) => a + b * x) (0.0) coeffList
这很好用。然后我们可以使用以下方式调用它:
- val test = horner [1.0, 2.0, 3.0] 2.0;
> val test = 17.0 : real
Where [1.0, 2.0, 3.0]
是表示多项式系数的列表,2.0
是变量 x 的值,并且17.0
是多项式的计算结果。
我的问题是这样的:我们有一个由 (int list list) 表示的二变量多项式。高级列表中的第 n 项将表示包含 y^n 的所有多项式项,低级列表中的第 m 项将表示包含 x^m 的所有多项式项。
例如:[[2],[3,0,0,3],[1,2]]
是多项式
( 2(x^0)(y^0) ) +
( 3(x^0)(y^1) + 0(x^1)(y^1) + 0(x^2)(y^1) + 3(x^3)(y^1) ) +
( 1(x^0)(y^2) + 2(x^1)(y^2) )
该函数需要返回指定 x 和 y 处的多项式值。
我尝试过使用 mlton 编译器的各种方法。
-
首先我尝试了嵌套的foldr函数:
fun evalXY (z::zs) x y =
foldr
(fn (s, li:list) =>
s + ((foldr (fn(a, b) => a + b*x) 0 li)*y)
)
0
z:zs
您可以看到我尝试使用“s”作为累加器,就像在单变量示例中使用“a”一样。由于foldr 处理的每个元素本身都需要“foldr”,因此我在描述外部foldr 的函数中再次调用foldr。我知道这个内部文件夹工作得很好,我在上面证明了这一点。*我的问题似乎是我无法访问外部文件夹所在的列表的元素以将该列表传递到内部文件夹中。 >看看我在内部文件夹中使用 li 的地方,这就是我的问题。 *
-
然后我尝试将我的单变量函数应用于地图。我遇到了同样的问题:
fun evalXY (z::zs) x y =
map
(foldr (fn(a, b) => a + b*x) 0 ???)
z:zs
*通过这次尝试,我知道我得到了一个整数列表。我放入了一个 int list 列表,其中内部列表被处理并由foldr 作为 int 返回到外部列表。之后我会再次折叠以将 y 值应用于多项式。
这里的函数应该类似于 :: fn evalXY : (int list list) * int * int) -> ... -> int list *
我是 SML 的新手,所以也许我在这里遗漏了一些基本的东西。我知道这是一种函数式编程语言,所以我尝试累积值而不是更改不同的变量,