f # программирование функции вставки? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь реализовать функцию, которая должна вставлять в порядке, используя <, если x существует в S, то S возвращается без изменений.Код, который я написал ниже, не выводится как задумано.Если у меня есть набор S = [2;4] и х = [4;6].Ожидаемый результат должен быть [2;4;6] где код ниже выводит [2;4;7].Любая помощь, чтобы исправить проблему приветствуется.Спасибо. </p>

let rec insert x S =
    match S with
    |[] -> x
    |e::rest -> e::(insert S rest)

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы должны взглянуть на Set <'a> тип .модуль Set предоставляет функцию Set.union (или оператор +), которая делает то, что вы хотите достичь.

let insert lst1 lst2 =
    Set.ofList lst1 + Set.ofList lst2
    |> Set.toList
0 голосов
/ 21 октября 2018

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

  • Будьте последовательны.Вы можете начать с соглашения об именах: у вас есть 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, что неправильно.

Есть другие проблемы с вашей реализацией, но я позволю вам разобраться с ними самостоятельно, чтоявляется частью процесса обучения.Подсказка: нет <.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...