Почему эти явно одинаковые строки не равны - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь следующий код:

open Str
let ss = (Str.first_chars "testing" 3);;
print_endline ("The first 3 chars of 'testing' are: "^ss);;
if (ss == "tes") 
  then print_endline "These are equal to 'tes'" 
  else print_endline "These are NOT equal to 'tes'"

Однако я получаю, что они НЕ равны:

$ ocaml str.cma testing2.ml

The first 3 chars of 'testing' are: tes
These are NOT equal to 'tes'

Почему первые 3 символа были извлечены Str.first_chars из "тестирования"не равно "tes"?

Кроме того, мне пришлось использовать ;;, чтобы этот код работал (комбинации из 1011 * и ;, которые я пробовал, не работали).Каков наилучший способ соединить эти 3 утверждения?

1 Ответ

3 голосов
/ 06 мая 2019

Функция (==) является оператором физического равенства.Если вы хотите проверить, имеют ли два объекта одинаковое содержимое, то вам следует использовать оператор структурного равенства, который имеет один знак равенства (=) .

Как лучше всегоположить эти 3 заявления вместе?

В OCaml нет операторов .Только выражения, все возвращаемые значения.Это похоже на математическую формулу, где у вас есть числа, операторы и функции, и вы объединяете их вместе в большие формулы, например, sin (2 * pi).Наиболее близкой вещью к выражению является выражение, которое имеет побочные эффекты и возвращает значение типа unit.Но это все еще выражение.

Вот пример того, как вы можете построить свое выражение, которое сначала свяжет возвращенную подстроку с переменной ss, а затем вычислит в порядке двух выражений: безусловная печать и условная печать.В целом, это будет одно выражение, оценивающее значение единицы.

open Str

let () = 
  let ss = Str.first_chars "testing" 3 in
  print_endline ("The first 3 chars of 'testing' are: " ^ ss);
  if ss = "tes" 
  then print_endline "These are equal to 'tes'" 
  else print_endline "These are NOT equal to 'tes'"

и вот как это работает

$ ocaml str.cma test.ml 
The first 3 chars of 'testing' are: tes
These are equal to 'tes'
...