#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