2009-06-02 5 views
2

this questionの後、私は何を考えるべきか分からない。なぜ "**"はOCamlの否定よりも緊密にバインドされませんか?

OCamlでは、-1.0 ** 2.0のようなものを入力すると(浮動小数点型が必要なため)、1.00を取得します。 standard order of operationsによれば、結果は-1でなければなりません(pythonのように)。

私は理由やOCamlの中に演算子の優先順位の明確な定義を見つけることができませんでした

...

これが原因型システムのですか?またはpowの下にバインディングがあるという事実?

答えて

1

オペレータの優先順位は、OCamlで構文指向です。つまり、関数識別子の最初の文字(および単項または二進のいずれか)が固定シーケンスに従って演算子の優先順位を決定します。これをHaskellのような言語と比較すると、関数識別子を構成する文字の種類にかかわらず、演算子の優先順位を関数定義で指定できます。

+1

これは常に正しいとは限りませんし、質問とは関係ありません。たとえば、**は同じ文字で始まっていても*よりも優先度が高くなります。同じ文字を使用していても、単項マイナスは減算よりも優先順位が高くなります。実際、OPの問題は、単項マイナスがOCamlの乗法とべき乗よりも実際に優先順位が高いことです。単項マイナスが減算と同じ優先順位を持つと仮定した場合には到着することができませんでした。 – newacct

+0

OCamlマニュアルのセクション6.7には、演算子の優先順位のテーブルがあります。すべてのバイナリ演算子は単項演算子よりも優先順位が低くなります(レコード、配列、文​​字列射影バイナリ演算子を除く)。算術演算の標準的な順序を取得し、プログラマが独自の演算子を定義できるようにするために、OCamlには追加の言語機能が必要であり、演算子は構文指向ではありません。 –

5

あなたが引用しているページには、「単項演算子 - 通常は「マイナス」」という行為の順序は問題になることが多いと言われています。 - それはExcelとbcをO'CAMLと同じ優先順位として引用していますが、 "書かれたまたは印刷された数学では" Pythonの場合と同じように動作します。したがって、本質的には、この特定の問題に関する普遍的なコンセンサスはありません。

関連する問題