2014-10-17 2 views
2

У меня есть два списка, которые содержат коэффициенты для двух разных полиномов, и я хочу написать функцию, которая может их умножать (например, F-O-I-L).SML - Коэффициенты умножения многочленов

Функция, которую я написал, не является полной, однако я просто использовал ее, чтобы проверить свое понимание того, как она должна работать.

fun polyMult(nil, nil) = nil 
    | polyMult(M as x::xs, N as y::ys) = 
     (x * y)::polyMult(xs, ys); 

Есть ли я на правильном пути?

Кроме того, у меня есть сообщение об ошибке uncaught exception Match [nonexhaustive match failure]

Что это значит?

ответ

2

К сожалению, вы не на правильном пути. Ваша функция просто застегивает два списка с умножением, что не работает F-O-I-L. По определению полиномиального умножения ваша функция должна возвращать многочлен более высокой степени. This должен помочь вам понять F-O-I-L.

Ошибка неисчерпаемого совпадения означает, что вы не охватываете все возможные случаи для двух списков в вашем шаблоне. На самом деле вам не хватает двух случаев, когда один из списков - nil, а другой - нет. В терминах вашей функции это будет означать случаи, когда функция имеет списки коэффициентов от многочленов разной степени.

Если вы хотите, чтобы отдельно обрабатывать эти два случая вы в настоящее время отсутствует, вы можете идти, как это:

fun polyMult(M, N) = case (M,N) of 
    ([], [])  => [] 
    | ([], y::ys) => ... 
    | (x::xs, []) => ... 
    | (x::xs, y::ys) => ... 

Конечно, заменить точки с вашей реализации. Надеюсь, это поможет, удачи.

+0

Я попытался изменить мою функцию, которая должна взять 'hd (M)' и умножить ее на 'hd (N)' для каждого рекурсивного вызова 'polyMult' =>' fun polyMult (M, N) = (hd (M) * hd (N)) :: polyMult (M, tl (N)), однако я просто получаю конкатенацию N @ M. – Delfino

+0

@mynorka Это определение не имеет базового случая, поэтому оно Не работай. Поскольку вы выполняете сопоставление с образцом, вы можете использовать 'x :: xs' и' y :: ys', как и в вопросе, вам не нужно использовать 'hd' и' tl'. – joom

+0

Я все еще получаю вывод только двух списков, объединенных. Есть ли специальная функция для 'lists' для умножения двух элементов вместе? – Delfino

0

Вы должны сделать это

fun foldL F y nil = y 
    | foldL F y (x::xr) = foldL F (F(x,y)) xr; 

fun polymult(M:real list, nil) = nil 
    | polymult(nil, N) = nil 
    | polymult(m::mr, N) = foldL(fn(x,a) => x * a) m N::polymult(mr,N); 

Thatll делать то, что вы хотите.

Смежные вопросы