私は OCaml の初心者です。OCaml の速度は気に入っていますが、その設計を完全には理解していません。たとえば、+
整数、浮動小数点数などをサポートするために、演算子をポリモーフィックにしたいと考えています。
なぜ必要なの+.
ですか?
私は OCaml の初心者です。OCaml の速度は気に入っていますが、その設計を完全には理解していません。たとえば、+
整数、浮動小数点数などをサポートするために、演算子をポリモーフィックにしたいと考えています。
なぜ必要なの+.
ですか?
'+'演算子を多形にして、整数や浮動小数点などをサポートしたいと思います。なぜ「+。」が必要なのですか?
すばらしい質問です。ここには多くの微妙なトレードオフが関係しています。
(OCamlのように)演算子をオーバーロードしないことの利点は次のとおりです。
欠点は次のとおりです。
+
精度の有理数、ベクトル、行列と複素数、低次元のベクトルと行列、同次座標など。int
+.
float
+/
+|
+||
いくつかの選択肢は次のとおりです。
2.3/0
:単純ですが、やのようなバグが発生し1/12*3.7
ます。OCaml は、比較演算子以外の多相演算子 (数値またはその他) をサポートしていません。対物は、さまざまなサイズの整数、浮動小数点数、およびその他の数値型を相互に変換する際に発生する可能性のある多くの+
微妙+.
なバグを取り除きます。また、コンパイラは常にどの数値型が使用されているかを正確に認識しているため、プログラマーが常に整数値を持つ数値について誤った仮定を行った場合に簡単に認識できるようになります。数値型間で明示的なキャストを要求するのは厄介に思えるかもしれませんが、長い目で見れば、明示的であるように余分な期間を書くために費やさなければならない時間よりも、奇妙なバグを追跡する時間を節約できるでしょう。
数値演算子のバージョンを除けば.
、OCaml の構文が特に変だとは思いません。これは、以前の ML 言語と非常に一致しており、追加された機能に対して適切かつ妥当な構文拡張が行われています。最初は奇妙に思えるかもしれませんが、それはおそらく、これまで、密接に関連した構文を持つ言語でしかプログラミングを行っていなかったことを示しているにすぎません。新しい言語を学ぶと、さまざまな利点と欠点を持つ言語構文を持つさまざまな方法があることがわかりますが、その多くは誰かが決めた恣意的な慣習にすぎません。
基本的に、SML と OCaml の型システム (オブジェクト システムとモジュールを無視) は、アドホック ポリモーフィズムをサポートしていません。これは設計上の決定です。また、OCaml は、SML とは異なり、算術演算に構文糖衣を含めることに反対しました。
ML ファミリの一部の言語では、数値演算子のアドホック ポリモーフィズムが非常に限定されています。たとえば、(+)
標準 ML のデフォルトの型は です(int, int) -> int
が(float, float) -> float
、引数または戻り値の型が であることがわかっている場合は型がありますfloat
。これらの演算子は SML では特別であり、組み込まれていない場合は定義できませんでした。また、このプロパティを他の値に付与することもできません。val add = (+)
タイプがあり(int, int) -> int
ます。ここでの特殊性は言語の構文に限定されており、型システムでのアドホック ポリモーフィズムのサポートはありません。
OCaml には、特別なセマンティクスを持つ少数の演算子があります (ただし、数値演算子はその中にありません||
) &&
。
let long_circuit_or = (||);;
let print_true x = print_string x; true;;
(* just prints "4" *)
print_true "4" || print_true "5";;
(* prints "45" *)
long_circuit_or (print_true "4") (print_true "5");;