C ++では、再帰的なテンプレートとテンプレートパラメーターとしての定数値により、階乗などのコード生成とコンパイル時の実行の興味深い例を実行できます。
パラメトリックポリモーフィズム、ファンクター、または他の概念を使用して、OCamlで同様のことを行うことは可能ですか?
C ++では、再帰的なテンプレートとテンプレートパラメーターとしての定数値により、階乗などのコード生成とコンパイル時の実行の興味深い例を実行できます。
パラメトリックポリモーフィズム、ファンクター、または他の概念を使用して、OCamlで同様のことを行うことは可能ですか?
ocaml干渉システムは統合を使用します。あなたはそれを計算装置と考えることができます、そしてこの場合それは論理プログラミングの感覚を持っています。しかし、これは型システムの目標の1つではなかったため、可能性はかなり制限されています。Jeffreyによって提案されたページでわかるように、統合によるタイプレベルの計算は、実際にはかなり制限されています(たとえば、乗算を表現するのは困難です)。Haskellにはもっと強力な制約言語がありますが、型システムでの論理プログラミングが良い方法かどうかはわかりません。
OCaml型システムの他の部分は型レベルの計算を行うことができ、そのモジュールとファンクター言語にあります。ファンクターを使用すると、正式なプログラミング言語Fωにリンクされたフレーバーでタイプレベルの計算を表現できます。モジュール言語でタイプレベルでチャーチ数をエンコードすることもできますが、有用で悪用可能な形式で結果を取得するのは非常に難しいため、これで何ができるかわかりません。特に、C ++またはDがコンパイル時定数の計算で行うように、その型情報をプログラムで使用できる値に戻す方法がわかりません。
そうです、OCamlの型システム(そしてSML、Haskell、Scalaも保持するほとんどの関数型言語)にはある程度の計算能力がありますが、いいえ、それらを使って特に有用な事前計算を行うことは期待していません。そしてそれは確かにOCamlプログラマーの間の標準的な慣習ではありません。タイプは、分類する値について静的な保証をもたらすタイプとして最もよく見られます。
OCaml型システムで算術演算を行うことができます。非常に簡単な例がこの他のStackoverflowページに表示されます。
このメカニズムを使用して、型システムの階乗を計算できると思います。数値の標準的な単項(Peano)エンコーディングを使用する場合、数値が大きくなり始めると、結果はかなり恐ろしいものになります。だから、それは面白いスタントになるでしょう。
タイプレベルで本当に興味深い計算を見たい場合は、Haskellを見てください。いくつかの一般的な拡張機能(GHCで利用可能)により、型システムで任意の計算が可能になります。つまり、型システムはチューリング完全です。