Сравнение строк с помощью функции ‘compare’

#sml

#sml

Вопрос:

Чтобы сравнить две строки и добавить строку в список, если они равны, я создал эту функцию, используя встроенную функцию сравнения:

 fun compareString(string, list) = 
    if compare(string, "hello") = EQUAL then string::list;
  

Однако это приводит к ошибке. Я предполагаю, что мой синтаксис должен быть неправильным, правильно ли я использовал функцию сравнения?

Согласно документации, функция сравнения работает следующим образом:

compare (s, t) выполняет лексикографическое сравнение двух строк с использованием порядка Char.compare символов. Возвращает LESS , EQUAL , или GREATER , если s меньше, равно или больше t соответственно.

Ответ №1:

  • То, что вы забываете, — это else …часть if-then-else. Эта часть обязательна.

  • Вероятно, вы хотите использовать эту функцию String.compare специально.

  • Однако, если вас интересует только случай равенства, вы можете просто использовать = оператор.

  • Имя CompareString — странное имя для функции, которая преобразует строку в список.

  • Имена string и list также являются не очень хорошими именами переменных, потому что они не описывают назначение переменных. Если функция является универсальной, то могут подойти общие имена, и вы можете выбрать любую схему общих имен, которая вам нравится.

  • Предикат включения (которому строка должна быть равна "hello" ) кажется немного глупым, поскольку вы будете точно знать, как будет выглядеть этот список; он будет изоморфен положительному целому числу. Если вместо этого вы превратили предикат включения в параметр, функция действительно может быть полезной.

Например:

 fun consIf (p, x, xs) =
    if p x
    then x :: xs
    else xs

fun is_greeting x = List.exists (fn y => x = y) ["hello", "hi", "good day"]
val ys = consIf (is_greeting, "hello", ["hi"])
  

Или превратите это в двоичный оператор и назовите его ::? , потому что он похож :: на условие:

 infixr 5 ::?
fun x ::? xs = fn p => if p x then x::xs else xs

val ys = ("boaty mcboatface!" ::? ["hi"]) is_greeting