Pergunta

Parece ser uma comparação de equivalência para alguns tipos, mas não strings.

# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true

Este é o esperado.

# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false

Por que "odp" != "odp" avaliar a true? O que é que realmente fazendo? ele não deve gerar um erro de tipo?

Foi útil?

Solução

que você tenha experimentado a diferença entre a igualdade estrutural e física.

<> é = (igualdade estrutural) como != é == (igualdade física)

"odg" = "odg"  (* true  *)
"odg" == "odg" (* false *)

é falsa porque cada um é instanciado em diferentes posições de memória, fazendo:

let v = "odg"
v == v (* true *)
v = v  (* true *)

Na maioria das vezes você vai querer usar = e <>.

editar sobre quando a igualdade estrutural e física são equivalentes :

Você pode usar o what_is_it função e descobrir toda a tipos que seria igual tanto estruturalmente e fisicamente. Como mencionado nos comentários abaixo, e no artigo ligado, caracteres, inteiros, unidade, lista vazia, e algumas instâncias de tipos de variantes terão essa propriedade.

Outras dicas

O oposto para o operador != é operador ==, não o =.

# "a" != "a" ;;
- : bool = true
# "a" == "a" ;;
- : bool = false

O operador == é uma "igualdade física". Quando você digita "a" == "a", você comparar dois diferentes instâncias de cordas que acontecem são parecidos, então o operador retorna false. Apesar de ter uma instância torna retornar true:

# let str = "a"
  in str == str ;;
- : bool = true
# let str = "a"
  in str != str ;;
- : bool = false

Uma rápida explicação sobre == e != em OCaml, além de todas as respostas corretas que já foram fornecidos:

1 / == e != expor detalhes de implementação que você realmente não quer saber sobre. Exemplo:

# let x = Some [] ;;
val x : 'a list option = Some []
# let t = Array.create 1 x ;;
val t : '_a list option array = [|Some []|]
# x == t.(0) ;;
- : bool = true

Até agora, tão bom: x e t.(0) são fisicamente iguais porque t.(0) contém um ponteiro para o mesmo bloco que x está apontando. Isto é o que conhecimento básico dos ditames de implementação. MAS:

# let x = 1.125 ;;
val x : float = 1.125
# let t = Array.create 1 x ;;
val t : float array = [|1.125|]
# x == t.(0) ;;
- : bool = false

O que você está vendo aqui são os resultados de uma otimização de outra forma útil envolvendo carros alegóricos.

2 / Por outro lado, há uma maneira segura para uso ==, e que é como uma maneira rápida, mas incompleta para verificar se há igualdade estrutural.

Se você estiver escrevendo uma função de igualdade em árvores binárias

let equal t1 t2 =
  match ...

verificação t1 e t2 pela igualdade física é uma maneira rápida para detectar que eles são, obviamente, estruturalmente iguais, mesmo sem ter que recurse e lê-los. Ou seja:

let equal t1 t2 =
  if t1 == t2
  then true
  else 
    match ...

E se você tenha em mente que, em OCaml o operador “boolean ou” é “preguiçoso”,

let equal t1 t1 =
  (t1 == t2) ||
  match ...

Eles são como dois "Tom" s em sua classe! Porque:

Neste caso, "odp" = "odp" porque eles são DOIS cordas com MESMO VALOR !!

Assim, eles não são == porque eles são DOIS cordas diferentes armazenar em diferente (Memória) localização

Eles são = porque eles têm o valor de seqüência idêntica .

Mais um passo mais profundo, "odp" é variável anônima. E duas variáveis ??ligações anônimas para este Dois strings.

Para sua conveniência:

# "odp" = "odp";; 
- : bool = true 
# "odp" != "odp";; 
- : bool = true 
# "odp" <> "odp";; 
- : bool = false

ints são o único tipo onde a igualdade física e estrutural são os mesmos, porque ints são o único tipo que é unboxed

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top