Некоторые примечания о вашем типе данных и функции:
- X - избыточный случай, он не имеет
значение в контексте арифметики
выражение.
- Вы злоупотребили функциями лямда, это
делает ваш код так трудно
понимать.
S (вычитание) и D (деление) не являются коммутативными, поэтому делать эти операции над списком аргументов - плохая идея. Я демонстрирую, как это сделать с помощью P (плюс) и M (умножение):
datatype e2 = Const of int | P of e2 list | M of e2 list;
val rec evl2 =
fn Const k => k
| P es => List.foldl (fn (e, acc) => acc + (evl2 e)) 0 es
| M es => List.foldl (fn (e, acc) => acc * (evl2 e)) 1 es;
Например: evl2 (P [Const 3, Const 2, M [Const 3, Const 2, Const 1]])
вернет 11
.
Если вы все еще хотите сделать это с S и D, вы можете сделать вывод из приведенного выше фрагмента кода.