2016-06-12 1 views
3

Caml의 연산자 ==은 같은 유형의 두 값 사이의 물리적 인 동일성을 테스트합니다. 특히이 방법으로 함수를 비교하는 데 사용할 수 있습니다.Caml의 함수에 대한 실제 동일성 테스트

하나는

# (==) == (==);; 
- : bool = false 

이 표현은 true으로 평가되어야한다, 놀랍게도, 예를

# print_string == print_string;; 
- : bool = true 

을 위해 가지고 있지만.

이 동작을 설명 할 수 있습니까?

+5

'(==)'는 고차 함수에 전달할 준비가 된 클로저로 존재하지 않습니다. 해당 응용 프로그램은 인라인 형식으로 직접 작성됩니다. 클로저는 필요할 때마다 할당되고'(==) == (==)'를 쓸 때 서로 다른 주소에 두 개의 클로저가 할당됩니다. 비슷한 속성을'print_string'에 쓰고 싶다면, 현재의 OCaml 구현체를 사용해서, 한 곳의 클로저에 모든 것을 사용할 수 있도록 이름을 지정하십시오 :'let phys_equal x y = x == y ;;'. 이것은 매번 적용되지 않은'(==)'에 대해 클로저를 할당하는 것보다 더 메모리 효율적인 것입니다. –

답변

5

==의 동작은 Pervasives 모듈에 정의된다 : E1 및 E2의 물리적 어떤지

E1은 E2 == 테스트. 참조, 배열, 바이트 시퀀스, 변경 가능한 필드가있는 레코드 및 변경 가능한 인스턴스 변수가있는 객체와 같은 변경 가능한 유형에서 e1의 물리적 수정이 e2에도 영향을주는 경우에만 e1 == e2가 true입니다. 비 변경 가능 유형에서 (==)의 동작은 구현에 따라 다릅니다. 그러나, E1 == E2 함수가 가변 아니므의 E1의 E2 = 0

비교 의미 것을 보장하는 유일한 보증은 ==와 동일 비교한다면 그들은 또한 compare와 동일 비교한다는 것이다. 함수가 compare과 비교 될 수 있다고 보장되지 않으므로, 이것은 본질적으로 ==이 비교 함수에 전혀 유용하지 않다는 것을 의미합니다.

# compare (==) (==);; 
Exception: Invalid_argument "equal: functional value". 

불변 값 false 반환 == 경우, 전혀 보장이 없습니다. 즉, ==은 임의의 불변 값에 대해 언제든지 false을 반환 할 수 있습니다. 두 번째 예제에서 false을 반환하는 것은 부적절하지 않습니다.

관련 문제