Как проверить нули в списке в sml - PullRequest
0 голосов
/ 06 сентября 2018

Я изо всех сил пытаюсь создать функцию, которая будет возвращать произведение каждого элемента в данном списке, исключая нули. Следующая функция корректно вернет произведение списка, но не исключит нули.

fun mult_nonzero(xs) = 
    case xs of [] => 0 
    | (x :: xs') => x * mult_nonzero(xs');

Как добавить проверку на нули?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Вы можете использовать foldl (или foldr). Если вы не знакомы с фолдом, стоит ознакомиться с ним.

fun mult_nonzero([]) = 0
  | mult_nonzero(xs) = foldl (fn (a, b) => if a = 0 then b else a*b) 1 xs
0 голосов
/ 07 сентября 2018

Вы можете выполнить сопоставление с шаблоном непосредственно в аргументе функции:

fun mult_nonzero [] = ...
  | mult_nonzero (x::xs) = ...

Подобно тому, как вы можете сопоставить аргумент, являющийся либо пустым списком, либо списком, по крайней мере, с одним элементом, вы также можете сопоставить первый элемент, являющийся чем-то конкретным, но представляющим еще один случай функции с шаблоном и телом. Я бы поставил его посередине:

fun mult_nonzero [] = ...
  | mult_nonzero ... = ...
  | mult_nonzero (x::xs) = x * mult_nonzero xs

Но работа с нулями в списке - не единственная ваша проблема.

У вашего базового случая 0, есть проблема, которую вы обнаружите, если сделаете несколько простых тестовых примеров:

val test_mult_nonzero_1 = mult_nonzero [5] = 5
val test_mult_nonzero_2 = mult_nonzero [5, 3] = 15
...