! =는 OCaml에서 의미가 있습니까?
어느 것이 아닌 일부 유형에 대한 동등성 비교 인 것입니다.
# 3 != 3;;
- : bool = false
# 3 != 2;;
- : bool = true
예상대로입니다.
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
왜 "odp" != "odp"
평가 true
? 실제로 무엇을하고 있습니까? 유형 오류가 발생하지 않습니다?
당신은 구조적 평등과 물리적 평등의 차이를 경험했습니다.
<>
is to =
(구조적 평등) as !=
is to ==
(물리적 평등)
"odg" = "odg" (* true *)
"odg" == "odg" (* false *)
각각 다른 메모리 위치에서 인스턴스화되기 때문에 false입니다.
let v = "odg"
v == v (* true *)
v = v (* true *)
대부분의 경우 =
및 <>
.
구조적 및 물리적 평등이 동등한 경우 편집 :
what_is_it 함수를 사용하여 구조적으로 물리적으로 모든 유형을 사용할 수 있습니다 . 아래 주석과 링크 된 문서에서 언급했듯이 문자, 정수, 단위, 빈 목록 및 변형 유형의 인스턴스는 속성을 갖습니다.
!=
연산자 의 반대는 연산자가 ==
아니라 연산자입니다 =
.
# "a" != "a" ;;
- : bool = true
# "a" == "a" ;;
- : bool = false
== 연산자는 "물리적 같음"입니다. 입력 입력 할 때을 닮은 "a" == "a"
두 개의 서로 다른 문자열 인스턴스 를 비교 하므로 연산자 는를 반환합니다 false
. 하나의 인스턴스가 있으면 true를 반환합니다.
# let str = "a"
in str == str ;;
- : bool = true
# let str = "a"
in str != str ;;
- : bool = false
이미 모든 정답 외에도 OCaml에 대한 ==
및 !=
OCaml에 대한 빠른 설명 :
1 / ==
그리고 !=
당신이 아버지에 대해 알고 싶어하지 않는 것이 구현 세부 사항을 노출합니다. 예 :
# 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
지금까지 좋은 너무 : x
와 t.(0)
물리적으로 동일하기 때문에 t.(0)
같은 블록에 대한 포인터가 들어 x
있습니다. 이것이 구현에 대한 기본 지식이 요구하는 것입니다. 그러나 :
# 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
여기에서보고있는 것은 float와 관련된 다른 유용한 최적화의 결과입니다.
2 / 반면에를 사용하는 안전한 방법은 ==
이 동일한 구조적 평등을 확인하는 빠른 불완전한 방법입니다.
이진 트리에 등식 함수를 작성하는 경우
let equal t1 t2 =
match ...
확인 t1
하고 t2
물리적 인 평등을 확인 하는 것은 분명히 재귀하고 읽을 필요도없이 구조적으로 동일 함을 감지하는 빠른 방법입니다. 그건 :
let equal t1 t2 =
if t1 == t2
then true
else
match ...
그리고 OCaml에서 "boolean or"연산자가 "lazy"라는 것을 기억한다면,
let equal t1 t1 =
(t1 == t2) ||
match ...
그들은 당신의 반에서 두 개의 "톰"과 같습니다! 때문에:
이 경우 동일한 값을 가진 두 개의 문자열 "odp" = "odp"
이기 때문에 !!
그래서 그들은 서로 다른 (메모리) 위치 에 두 개의 서로 다른 문자열을 저장 ==
하기 때문 이 아닙니다.
그들은 =
그들이 가지고 있기 때문에 동일한 문자열 값을 .
한 단계 더 깊이 들어가면 "odp"는 익명 변수입니다. 두 개의 익명 변수가이 두 개의 문자열로 이어집니다 .
편의를 위해 :
# "odp" = "odp";;
- : bool = true
# "odp" != "odp";;
- : bool = true
# "odp" <> "odp";;
- : bool = false
int는 unboxed 유일한 유형이기 때문에 물리적 및 구조적 동등성이 동일한 유일한 유형입니다.
참고 URL : https://stackoverflow.com/questions/1412668/does-have-meaning-in-ocaml
'ProgramingTip' 카테고리의 다른 글
브라우저가 개행을 공백으로 기술하는 이유는 무엇입니까? (0) | 2020.11.27 |
---|---|
Windows 탐색기에서 파일 목록을 텍스트로 복사 (0) | 2020.11.27 |
RSync : 양방향으로 구매하고 있습니까? (0) | 2020.11.27 |
Java에서 프로토콜 기능에 해당하는 C ++이 있습니까? (0) | 2020.11.27 |
Python에서 PIL을 사용하여 이미지를 다른 이미지에 어떻게 합성하고 있습니까? (0) | 2020.11.27 |