У меня есть несколько предложений, которые помогут вам в программировании:
- Будьте последовательны.Вы можете начать с соглашения об именах: у вас есть
x
в нижнем регистре и S
в верхнем регистре, что вводит в заблуждение. - Используйте имена, которые являются значимыми для вас.Даже если они станут слишком длинными, вы можете сократить их позже.В последней строке вы звоните
insert
на S
и rest
, но rest
является частью S
, так что это не имеет смысла.Если бы было яснее, что к чему, вы наверняка заметили бы ошибку. - Посыпьте
printfn
в нескольких местах, чтобы вы могли реально увидеть, что происходит.Таким образом, вы можете сами все выяснить.
Я переписываю ваш код, следуя совету, изложенному выше.Заметьте, я не изменяю код только именем переменных и добавляю некоторые printfn
s
let rec addToOrderedList orderedList listToBeAdded =
printfn "addToOrderedList %A %A" orderedList listToBeAdded
match listToBeAdded with
| [] -> printfn "nothing to add, finishing"
orderedList
| elem::restOfListToBeAdded -> printfn "adding element %A" elem
elem::(addToOrderedList listToBeAdded restOfListToBeAdded)
Обратите внимание в последней инструкции на рекурсивный вызов addToOrderedList listToBeAdded restOfListToBeAdded
.Теперь ясно, что вы пытаетесь добавить restOfListToBeAdded
к listToBeAdded
, что неправильно.
Есть другие проблемы с вашей реализацией, но я позволю вам разобраться с ними самостоятельно, чтоявляется частью процесса обучения.Подсказка: нет <
.