Список SML [1, 2, 3, ... n] - PullRequest
       19

Список SML [1, 2, 3, ... n]

0 голосов
/ 19 января 2020

Мне нужно создать список [1,2,3 ... n] без использования предварительно реализованных функций List. Я могу сделать список в обратном порядке, написав:

fun makeList(x : int) = 
if x = 0
then []
else x :: makeList(x-1)

Затем я могу изменить его и получить [1,2,3,4] при вводе 4. Как бы я сделал это только в одной функции?

1 Ответ

2 голосов
/ 23 января 2020

Вы создали обратный список в одной функции и без использования библиотеки списков.

Чтобы сделать его в правильном порядке, вы можете использовать накопительный аргумент:

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. Поскольку постановка задачи неясна по этому поводу, ответ может быть неудовлетворительным.

Либо вы делаете одну функцию, и допускаете, чтобы ее сигнатура типа отличалась (принимая дополнительный аргумент), либо вы сделайте одну открытую функцию и дайте ей иметь внутреннюю функцию, которая накапливает результат в обратном порядке.

...