2012-12-03 3 views
3

나는 Jason Hickey's Introduction to Objective Caml을 배우고 있습니다.중온 계산기를 재정의하십시오

그냥 에 대한 질문이 있습니다. 중온 계산기을 재정의하십시오.


그래서 책에서, 같은 단락이 :

# let (+) = (*) 
     and (-) = (+) 
     and (*) = (/) 
     and (/) = (-);; 
    val + : int > int > int = <fun> 
    val - : int > int > int = <fun> 
    val * : int > int > int = <fun> 
    val/: int > int > int = <fun> 
# 5 + 4/1;; 
-: **int = 15** 

첫째, 이러한 재정의 작업을 수행하는 방법?

모든 작업이 다시 정의되고 연결되어 있기 때문에 함수가 일종의 무한 루프로 실행되는 것 같습니다.

예를 들어, 내가 1+2을 할 경우, 그것은 1 * 2되며 (*) = (/) 때문에, 그 다음 1/2(/) = (-) 때문에, 그때는 1-2 일에 너무 등등 것입니다 될 것입니다. 맞습니까?


둘째, 5 + 4/1의 결과는 기능을 재정의에있어서 하나의 단계를 실행하는 경우에도, 15 것인가?

그래서 재정의 오른쪽, 상기 한 단계를 실행하지 즉 1 + 21 * 2되며 더 이상의 변형되므로 5 + 4/15 * 4 -1이되어야 할 것으로 가정? 그 답은 19입니다. 맞습니까? 나에게

답변

6

, 모든 작업이 재정의와 연결된 것 같다 때문에 기능, 무한 루프의 종류에서 실행되고있는 것 같다.

실제로는 삽입 연산자 (and 키워드 포함)의 동시 재 정의에 불과합니다. 당신이 보는 것은 이 아니라 재귀적인 정의입니다. OCaml에서 재귀 적 정의는 rec (여러분이 이미 알고있는 것처럼)을 사용합니다.

질문의 두 번째 부분에 대해서는 운영자 우선 순위의 문제라고 생각합니다. 원래 표현식에서 5 + 4/1은 산술 연산자에 대한 일반적인 우선 순위 규칙에 따라 실제로는 5 + (4/1)입니다. 그래서, 저는이 변환이 단순히이 바인딩 (일종의)을 보존한다고 생각합니다. 그리고 5 * (4 - 1) = 15이됩니다.

+0

그래서 ** rec rec **를 사용하면 답이 다릅니다. 내 이미지가 될거야? –

+0

@JacksonTale : 그렇습니다. 그러나이 정의에 대해'rec'를 사용할 수 없습니다 (컴파일러가 싫어했습니다.). 대신'let (+) x y = x * y and ... '를해야합니다. 그러나 당신은 결과에 대해 옳았습니다. 저는 사업자를 그런 식으로 다시 정의하고 루프로 들어 섰습니다. 건배! –

3

키 관찰 (이럴) (+)하지 몇줄 나중에 나타나는 하나 (*)의 정의를, 선재에 의해 정의되고있는 점이다. 유사하게, (*)에 의해 정의되고, 기존에이라는 정의는 (/)이다. Asiri가 말했듯이 이것은 let rec 대신 let을 사용하기 때문입니다.

OCaml에서 우선 순위와 연관성은 연산자에 내재되어 있으며 정의에 의해 변경 될 수 없습니다. 우선 순위와 연관성은 운영자의 첫 번째 문자에 의해 결정됩니다.

연산자 우선 순위 테이블과 연관성 테이블을 Section 6.7 of the OCaml Manual에서 보면 "X 문자로 시작하는 연산자"에 대해 모든 항목이 정의되어 있음을 알 수 있습니다.

+0

+1, 우리가 다시 정의함으로써 "+"의 의미를 바꾸더라도 연관성을 변경할 수는 없다. 이것은 표현의 정적 형태에 의해 결정된다 (당신이 지적한 테이블에 의해 지배 됨) . 건배! –

+1

오른쪽에서 우선 순위와 연관성은 연산자의 첫 문자를 기준으로 고정됩니다. 내 대답을 업데이트 할게. –

관련 문제