Совпадение всегда выполняется успешно при разыменовании указателя OCaml

#ocaml

Вопрос:

Мой код выглядит следующим образом

 let newObj (s) : someObj = 
   let myStr = ref s in
   let myInt = ref 0 in {
       someFun = (fun newS ->
           match !myStr with
           | newS -> true
           | _ -> false
   }
;;
 

Я протестировал этот код

 let test = newObj "right";;
test.someFun "right";;
test.someFun "wrong";;
 

Оба вызова SomeFun возвращают значение true.

Я также пытался

 if (!mystr = newS) then true else false
 

и это работает. Почему?

Комментарии:

1. Можете ли вы уточнить, в чем именно заключается ваша проблема

Ответ №1:

Значение идентификатора в шаблоне-это не то, что вы, кажется, думаете. Любой идентификатор, который появляется в шаблоне, является новым вхождением идентификатора, который будет привязан к любому сопоставленному значению. Итак, этот матч:

        match !myStr with
       | newS -> true
       | _ -> false
 

всегда будет совпадать в первом случае. Он привязывает идентификатор newS к значению !myStr ; однако это не имеет видимого эффекта, так как вы не используете newS в связанном выражении.

Значение newS в шаблоне не имеет ничего общего с каким-либо предыдущим появлением идентификатора newS . Это новое использование идентификатора.

Вот почему это if утверждение работает. Это относится к существующей привязке идентификатора (здесь нет никакого шаблона).

Как я уже отмечал, когда я ввожу приведенное выше выражение, компилятор предупреждает меня следующим образом:

 Warning 11: this match case is unused.
 

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

Хорошо обращать внимание на подобные предупреждения.