Есть ли способ в smlnj итерировать список без потери ссылки на его голову? - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь написать функцию, которая принимает в качестве входных данных список обращенной двоичной формы числа и условия, при котором оно завершается. Он должен возвращать лексикографически минимальную сумму степеней 2, представляющих число, вплоть до определенной суммы. т.е. 42, написанные с 6 степенями, будут 101010-> 221001. Моя идея состоит в том, что если элемент больше 0, добавьте 2 к элементу до него, пока не достигнете необходимой суммы, иначе перейдите к следующему элементу. Пока это выглядит так:

fun sum li = List.foldl (op+) 0 li 

fun leximin ([],limit) = []
  | leximin ([x],limit) =  [x]
  | leximin (x::y::xs,limit) =
    if limit > sum (x::y::xs) then(
    if y > 0 then leximin(x+2::y-1::xs,limit) else x::leximin(y::xs,limit)
    )else
        [] 

Проблема в том, что, насколько я понимаю, списки в sml похожи на стеки. У меня нет никакого способа перейти к следующему элементу, не поднимая голову и не теряя ссылки на него, так что я могу начать итерацию списка с самого начала. Другими словами, моя внутренняя часть «еще» неверна. Должен ли я отказаться от использования списка или есть способ, о котором я не думал?

...