Вы можете выполнить сопоставление с шаблоном непосредственно в аргументе функции:
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