Пользовательская сортировка компаратора в SML?

Я немного застрял с этой проблемой в SML / SMLNJ, и мне бы хотелось получить некоторые рекомендации. Итак, у меня есть проблема, когда мне нужно создать функцию с именем insertSorted, где она принимает число, оператор сравнения и (предполагаемый отсортированный) список, в который нужно вставить. Я не уверен, как начать подходить к этому, поэтому любая помощь будет потрясающей.

Моя идея состоит в том, чтобы разделить два списка там, где будет число, вставить число, а затем объединить оба списка.

fun insertSorted (x, comp, []) = [x] 
  |  insertSorted (x, comp, a::rest) = ...

Обновление: теперь я продвинулся немного дальше, мне просто нужно знать, как это отлаживать, какие-нибудь рекомендации?

fun insertSorted (x, []) = [x]
 |  insertSorted (x, y::ys) = 
    if (x < y)
        then x::y::ys
    else if (x > y) 
        then y::x::ys
    else y::insertSorted (x, ys);

Обновление 2: Моя новая цель — выяснить, как объединить эти две функции в одну. В конечном итоге названный insertSorted.

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x<y then x::y::ys else y :: insertSorted (x,ys);

fun insertSorted (x, nil) = [x]
 |  insertSorted (x,y::ys) = if x>y then y::x::ys else y :: insertSorted (x,ys);
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть три случая:

  1. Список nil.
    • Вы уже освещали это. :-)
  2. Список не nil, и его первый элемент меньше x, поэтому нам нужно продолжать искать, куда вставить x.
    • В этом случае результатом должен быть первый элемент, за которым следует результат вставки x в остальную часть списка.
  3. Список не nil, и его первый элемент больше или равен x, поэтому мы можем вставить x прямо здесь.
    • В этом случае результатом должно быть x, за которым следует весь список.

Различение случаев № 2 и № 3 включает if/then/else; реализация случая № 2 включает рекурсию.

Большое спасибо, что нашли время ответить! У меня есть один вопрос: как я могу пройти сравнение. Код, который мне дали для проверки, выглядит следующим образом: 'insertSorted(5, fn(a, b) => a < b, [8, 6, 5, 3, 1]));'

Mason Garcia 12.12.2020 01:15

@MasonGarcia: извините, я не понимаю вашего вопроса. Что вы подразумеваете под "как я мог пройти сравнение"?

ruakh 12.12.2020 01:19

Таким образом, цель функции insertSorted состоит в том, чтобы взять число (для вставки), оператор сравнения (т. е. a < b) и список для вставки. У меня возникли проблемы со вставкой сравнительного оператора в мой код.

Mason Garcia 12.12.2020 01:21

Извините, что так часто отмечаю вас, я все еще привыкаю к ​​переполнению стека

Mason Garcia 12.12.2020 01:47

Ваш тестовый код точно показывает, как это сделать. fn(a, b) => a < b — это функция, которая принимает пару значений и возвращает значение, меньшее ли первое значение второго. (Кстати, это функция или функциональное выражение, а не оператор. Стандартный ML на самом деле не имеет «операторов», но его ближайшим аналогом будет «декларация», которой нет.)

ruakh 12.12.2020 01:58

Спасибо за разъяснения, я долго мучился с терминологией! Я собираюсь опубликовать редактирование: обновление 2. Теперь мой новый вопрос: как я могу выполнить 2 сравнительные функции в одной и той же «основной» функции?

Mason Garcia 12.12.2020 02:02

@MasonGarcia: О, кажется, я понял - ваш вопрос о том, как вызвать функцию сравнения? Вы можете написать, например. comp (x, y).

ruakh 12.12.2020 02:09

@rukah, я не могу найти никакой документации по функции comp. Любая идея, как реализовать это в моем коде?

Mason Garcia 12.12.2020 03:28

@MasonGarcia: рассмотрим функцию fun double i = 2 * i, которая принимает целое число и возвращает его в два раза (например, double 3 равно 6). Вы не найдете никакой документации по целому числу i, потому что это не конкретное целое число; это просто параметр функции и может быть любым целым числом. Точно так же в вашем случае comp не является конкретной функцией; это просто параметр функции и может быть любой функцией типа int * int -> bool.

ruakh 12.12.2020 06:50

(Если эта концепция для вас нова и вам трудно ее понять, посмотрите «Первоклассная функция» в Википедии.)

ruakh 12.12.2020 06:53

Другие вопросы по теме