복잡한 산술 연산자를 사용하여 코드를 더 읽기 쉽게 만들어야합니다. Ocaml에는 Complex 모듈이 있으므로 이러한 함수를 호출하는 연산자를 추가하기 만하면됩니다.Ocaml은 사용자 정의 연산자의 우선 순위를 어떻게 결정합니까?
나를위한 가장 직관적 인 방법은 '&'을 연산자 기호에 추가하여 모든 일반 연산자를 사용하여 새로운 복합 연산자를 만드는 것입니다. 따라서 + & 및 * &은 복잡한 더하기 및 곱셈이됩니다. 나는 또한 ~ &을 복합 결합으로 사용하고 싶습니다.
이 연산자를 사용하려면 일반 연산과 동일한 방식으로 연결해야합니다. 다음 세션을 토대로, 그들은 원하는대로 자동으로 행동하지만, 이유를 이해하고 싶습니다. 그래서 더 많은 연산자를 소개 할 때 끔찍한 버그를 얻지는 않습니다.
현재의 추측은 정상적인 산술 우선 순위와 일치하는 순서에 따라 연산자 기호를 어휘 적으로 정렬하여 우선 순위를 결정한다는 것입니다. 그러나 나는 이것을 확인할 수 없다.
세션 하나를
# open Complex;;
# let (+&) a b = add a b;;
val (+&) : Complex.t -> Complex.t -> Complex.t = <fun>
# let (*&) a b = mul a b;;
val (*&) : Complex.t -> Complex.t -> Complex.t = <fun>
# one +& zero *& one +& zero *& one;;
- : Complex.t = {re = 1.; im = 0.}
# zero +& one *& zero +& one *& zero;;
- : Complex.t = {re = 0.; im = 0.}
# i +& i *& i +& i *& i *& i;;
- : Complex.t = {re = -1.; im = 0.}
세션 2 : 일반적으로
# open Complex;;
# let (*&) a b = mul a b;;
val (*&) : Complex.t -> Complex.t -> Complex.t = <fun>
# let (+&) a b = add a b;;
val (+&) : Complex.t -> Complex.t -> Complex.t = <fun>
# one +& zero *& one +& zero *& one;;
- : Complex.t = {re = 1.; im = 0.}
# zero +& one *& zero +& one *& zero;;
- : Complex.t = {re = 0.; im = 0.}
# i +& i *& i +& i *& i *& i;;
- : Complex.t = {re = -1.; im = 0.}
# let (~&) a = conj a;;
val (~&) : Complex.t -> Complex.t = <fun>
# (one +& i) *& ~& (one +& i);;
- : Complex.t = {re = 2.; im = 0.}
감사합니다. 나는 정답이 더 유용하지 않다는 것을 짜증나게한다. 나도 충분히 익숙하지 않아 그것을 사용하는 p4/p5. – forefinger
위대한 링크. camlp {4,5}에 대해 언급 할 예정 이었지만 운영자의 우선 순위를 고치는 것은 원래의 질문에서 의미가있었습니다. 끝은 미래를 보장하는 코드를 만드는 것이 었습니다.Camlp {4,5}를 포함하는 해결책이이 목표를 향한 좋은 해결책이 될지 의심 스럽습니다. 그것은 종종 유혹적이지만 피하려고 노력하는 것은 분명히 의존성입니다. –