Вы создали обратный список в одной функции и без использования библиотеки списков.
Чтобы сделать его в правильном порядке, вы можете использовать накопительный аргумент:
fun makeList 0 result = result
| makeList n result = makeList (n-1) (n :: result)
Тестирование это:
- makeList 10 [];
> val it = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] : int list
Эта функция принимает дополнительный аргумент, в котором она накапливает результат в правильном порядке.
Это то, что запутывает других корреспондентов в этом вопросе и что сделал предыдущий Ответчики удаляют свои ответы. Либо вы соглашаетесь с тем, что этот makeList
принимает дополнительный пустой список в качестве начального аргумента, что выглядит довольно грязно, либо вы вкладываете эту функцию в другую функцию, которая скрывает этот механизм:
fun makeList n =
let fun go 0 result = result
| go i result = go (i-1) (i :: result)
in go n [] end
Но тогда вы бы не использовали одну функцию. Если вы не имеете в виду одну открытую функцию, поскольку внутренняя функция доступна только в контексте определения makeList
. Поскольку постановка задачи неясна по этому поводу, ответ может быть неудовлетворительным.
Либо вы делаете одну функцию, и допускаете, чтобы ее сигнатура типа отличалась (принимая дополнительный аргумент), либо вы сделайте одну открытую функцию и дайте ей иметь внутреннюю функцию, которая накапливает результат в обратном порядке.