3

Jason Hickey の 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、というようになります。私は正しいですか?


第 2 に、関数が再定義で 1 ステップだけ実行されたとしても、の結果は に5 + 4 / 1なりますか?15

したがって、再定義がさらに 1 ステップ実行されると1 + 2仮定1 * 25 + 4 / 1ます5 * 4 -1。答えは19です。私は正しいですか?

4

2 に答える 2

6

私には、すべての操作が再定義されて接続されているように見えるため、関数が一種の不定ループで実行されているように見えます。

そうではなく、中置演算子 (andキーワードを使用) を同時に再定義しただけです。表示されるものは、再帰的な定義ではありません。OCaml では、再帰的な定義はlet recで行います (ご存知かもしれませんが)。

質問の 2 番目の部分については、演算子の優先順位の問題だと思います。5 + 4 / 1元の式では、実際5 + (4/1)には算術演算子の通常の優先順位規則に従っていることに注意してください。したがって、変換は単にこのバインディングを保持すると思います (一種の)。そして、あなたは得る5 * (4 - 1) = 15

于 2012-12-03T15:31:59.473 に答える
3

重要な観察結果 (IMHO) は、数行後に表示されるものではなく、既存の の定義(+)によって定義されていることです。同様に、は の既存の定義によって定義されています。Asiri が言うように、これはではなく を使用しているためです。( * )( * )(/)letlet rec

また、OCaml では優先順位と結合性が演算子に固有のものであり、定義によって変更できないことも事実です。優先順位と結合性は、演算子の最初の文字によって決まります。

OCaml マニュアル のセクション 6.7 にある演算子の優先順位と結合性の表を見ると、すべてのエントリが「文字 X で始まる演算子」に対して定義されていることがわかります。

于 2012-12-03T15:58:31.783 に答える