полиномиальное уравнение стандартное мл - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь создать функцию, которая будет решать однофакторное полиномиальное уравнение в стандарте 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, и мы хотим заменить x на 2, то мы бы назвали Eval следующим образом:

eval ([1.0, 5.0, 3.0], 2.0);

и результат должен быть 23,0, но иногда на разных входах, он дает мне разные ответы, но на этом импульсе он дает мне следующую ошибку

необработанное исключение Пусто поднято в: smlnj / INIT / pervasive.sml: 209.19-209.24

в чем может быть моя проблема?

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

После некоторых рекурсивных вызовов функция elms получает пустой список в качестве аргумента. Поскольку count всегда больше 0, (length l) = count всегда ложно, и вызовы 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)
4 голосов
/ 16 марта 2012

Empty повышается, когда вы запускаете hd или tl в пустом списке. hd и tl почти никогда не используются в ML; списки почти всегда деконструируются с использованием сопоставления с образцом; это намного красивее и безопаснее. Похоже, у вас нет аргументов в пользу пустых списков, и я не просматривал ваш код, чтобы выяснить, что вы сделали, но вы должны сами разобраться с этим.

...