Functional programming 多项式方程标准ml

Functional programming 多项式方程标准ml,functional-programming,standards,eval,sml,Functional Programming,Standards,Eval,Sml,我试图制作一个函数,用标准ML来解一个单变量多项式方程,但它总是给我错误 代码如下 (* Eval Function *) - fun eval (x::xs, a:real):real = let val v = x (* The first element, since its not multiplied by anything *) val count = 1 (* We start counting from the second elemen

我试图制作一个函数,用标准ML来解一个单变量多项式方程,但它总是给我错误

代码如下

(* Eval Function *)
- fun eval (x::xs, a:real):real = 
    let
        val v = x (* The first element, since its not multiplied by anything *)
        val count = 1 (* We start counting from the second element *)
    in
        v + elms(xs, a, count)
    end;

(* Helper Function*)
- fun pow (base:real, 0) = 1.0
    | pow (base:real, exp:int):real = base * pow(base, exp - 1);

(* A function that solves the equation except the last element in the equation, the constant *)
- fun elms (l:real list, a:real, count:int):real = 
    if (length l) = count then 0.0
    else ((hd l) * pow(a, count)) + elms((tl l), a, count + 1);
现在输入应该是系数,如果多项式元素和一个数字来代替变量,即如果我们有函数3x^2+5x+1,并且我们想用2代替x,那么我们将调用如下计算:

eval ([1.0, 5.0, 3.0], 2.0);
结果应该是23.0,但有时在不同的输入上,它会给我不同的答案,但在这个输入上,它会给我以下的错误

在以下位置引发的未捕获异常为空: smlnj/init/perversal.sml:209.19-209.24


我这里有什么问题?

Empty
在空列表上运行
hd
tl
时会引发
hd
tl
几乎从未在ML中使用过;列表几乎总是使用模式匹配来解构;它更漂亮、更安全。您似乎没有空列表的理由,我也没有仔细检查您的代码以了解您做了什么,但您应该能够自己解决它。

在一些递归调用之后,
elms
函数将空列表作为其参数。由于
count
始终大于0,因此
(length l)=count
始终为false,空列表上的调用
hd
tl
随即失败

解决此问题的一个好方法是使用模式匹配来处理
eval
elms
上的空列表:

fun elms ([], _, _) = 0.0
  | elms (x::xs, a, count) = (x * pow(a, count)) + elms(xs, a, count + 1)

fun eval ([], _) = 0.0 
  | eval (x::xs, a) = x + elms(xs, a, 1)