Использование стандартной библиотеки, функция, которая производит номера [1; п -1],
fun below n = List.tabulate (n-1, fn i => i+1);
функцию, которая удаляет число делится на 2 или 3,
val filter23 = List.filter (fn i => i mod 2 <> 0 andalso i mod 3 <> 0)
функция, которая вычисляет произведение его вход,
val product = List.foldl op* 1
и приклеивая их все вместе,
val f = product o filter23 o below
Это генерирует список, фильтрует его и сворачивает его. Это отнимает больше памяти, чем необходимо. Было бы более эффективно делать то, что @FPstudent и @coder делать и генерировать числа, и немедленно либо сделать их частью конечного продукта, либо выбросить их, если они делятся на 2 или 3. Две вещи, которые вы могли бы сделать в Кроме того,
Сделать функцию хвостовой рекурсивной, поэтому она использует меньше пространства стека.
Обозначим итерацию/складывание в общий узор.
Например,
fun folditer f e i j =
if i < j
then folditer f (f (i, e)) (i+1) j
else e
fun accept i = i mod 2 <> 0 andalso i mod 3 <> 0
val f = folditer (fn (i, acc) => if accept i then i*acc else acc) 1 1
Это похоже на Python's xrange.