Я пытаюсь написать функцию, которая принимает в качестве входных данных список обращенной двоичной формы числа и условия, при котором оно завершается. Он должен возвращать лексикографически минимальную сумму степеней 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 похожи на стеки. У меня нет никакого способа перейти к следующему элементу, не поднимая голову и не теряя ссылки на него, так что я могу начать итерацию списка с самого начала. Другими словами, моя внутренняя часть «еще» неверна. Должен ли я отказаться от использования списка или есть способ, о котором я не думал?