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?
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