| パラダイム | 機能的 |
|---|---|
| デザイン: | エドウィン・ブレイディ |
| 初登場 | 2007年[1] |
| 安定版リリース | 1.3.4 [2]
/ 2021年10月22日 |
| プレビューリリース | 0.7.0 (イドリス2) [3]
/ 2023年12月22日 |
| タイピングの規律 | 推測、静的、強い |
| OS | クロスプラットフォーム |
| ライセンス | BSDA の |
| ファイル名拡張子 | .idr、.lidr |
| Webサイト | idris.org より |
| 影響を受けた | |
| Agda、Clean、[4]、 Coq、[5]、 Epigram、F#、Haskell、[5]、 ML、[5]、 Rust [4] | |
Idris は、依存型、オプションの遅延評価、全体性チェッカーなどの機能を備えた純粋に関数型の プログラミング言語です。Idris は証明支援として使用することもできますが、 Haskellに似た汎用プログラミング言語として設計されています。
Idris の型システムはAgdaのものと似ており、証明はCoqのものと似ており、エラボレータ リフレクションによるタクティクス (定理証明関数/手順) も含まれています。 [6] Agda や Coq と比較すると、Idris は副作用の管理と組み込みドメイン固有言語のサポートを重視しています。Idris はC ( Cheney のアルゴリズムを使用したカスタム コピーガベージ コレクターを使用) とJavaScript (ブラウザーベースとNode.jsベースの両方) にコンパイルされます。Java仮想マシン(JVM)、共通中間言語(CIL)、LLVMなど、他のプラットフォーム用のサードパーティ コード ジェネレーターもあります。[7]
イドリスは、1970年代のイギリスの子供向けテレビ番組「アイヴァー・ザ・エンジン」に登場する歌うドラゴンにちなんで名付けられました。[8]
特徴
Idris は、比較的主流の関数型プログラミング言語のいくつかの機能と、証明支援システムから借用した機能を組み合わせています。
関数型プログラミング
Idris の構文は Haskell の構文と多くの類似点があります。Idrisのhello world プログラムは次のようになります。
モジュールメイン
main : IO ()
main = putStrLn "Hello, World!"
このプログラムとHaskellの同等のプログラムとの唯一の違いは、メイン関数の型シグネチャにコロンが1つ(2つではなく)あることと、モジュール宣言whereで単語「 」が省略されていることです。 [9]
帰納的およびパラメトリックなデータ型
Idris は、帰納的に定義されたデータ型とパラメトリック多態性をサポートしています。このような型は、従来のHaskell 98 のような構文 で定義できます。
データツリーa =ノード(ツリーa ) (ツリーa ) |リーフa
または、より一般的な一般化代数データ型(GADT) のような構文で次のように記述します。
データツリー:タイプ->タイプwhereノード:ツリーa ->ツリーa ->ツリーa
リーフ: a ->ツリーa
依存型
依存型では、型に値が現れる可能性があります。つまり、型チェック中に任意の値レベルの計算を実行できます。以下は、プログラムの実行前に長さがわかっているリストの型を定義します。これは、従来はベクターと呼ばれています。
データVect : Nat -> Type -> Type where Nil : Vect 0 a
(::) : ( x : a ) -> ( xs : Vect n a ) -> Vect ( n + 1 ) a
このタイプは次のように使用できます。
合計
追加: Vect n a -> Vect m a -> Vect ( n + m ) a Nil ys = ys を
追加
追加( x :: xs ) ys = x ::追加xs ys
関数は、型の要素appendのベクトルを型の要素のベクトルに追加します。入力ベクトルの正確な型は値に依存するため、結果のベクトルが正確に ( + ) 個の 型の要素を持つことをコンパイル時に確信できます。単語 " "は、関数がすべての可能なケースをカバーしていない場合、または無限ループに入らないことを (自動的に) 証明できない場合にエラーを報告する全体性チェッカーを呼び出します。
mananmatotal
もう 1 つの一般的な例は、長さに基づいてパラメータ化された 2 つのベクトルのペアごとの加算です。
合計
ペア追加: Num a => Vect n a -> Vect n a -> Vect n a
pairAdd Nil Nil = Nil
pairAdd ( x :: xs ) ( y :: ys ) = x + y :: pairAdd xs ys
Numa は、型 a が型クラス Numに属していることを示します。1 つのベクトルに大文字小文字の一致がなくNil、もう 1 つのベクトルに数値がある場合でも、この関数は total として正常に型チェックされることに注意してください。型システムはベクトルの長さが同じであることを証明できるため、コンパイル時に大文字小文字の一致が発生しないことが保証され、関数の定義にその大文字小文字を含める必要はありません。
証明アシスタント機能
依存型はプログラムのほとんどのプロパティをエンコードできるほど強力であり、Idris プログラムはコンパイル時に不変条件を証明できます。これにより、Idris は証明アシスタントになります。
証明支援システムと対話する標準的な方法は 2 つあります。一連のタクティック呼び出しを記述する方法 (Coq スタイル) と、対話的に証明項を詳述する方法 ( Epigram –Agda スタイル) です。Idris は両方の対話モードをサポートしていますが、利用可能なタクティックのセットはまだ Coq ほど便利ではありません。[あいまい]
コード生成
Idrisには証明支援機能が含まれているため、Idrisプログラムは証明を渡すように記述することができます。単純に扱うと、そのような証明は実行時に残ってしまいます。Idrisは、使用されていない項を積極的に削除することでこの落とし穴を回避することを目指しています。[10] [11]
デフォルトでは、Idris はCを通じてネイティブ コードを生成します。公式にサポートされている他のバックエンドはJavaScript を生成します。
イドリス2
Idris 2は、定量的型理論に基づいた線形型システムを深く統合した、新しい自己ホスト型言語バージョンです。現在はSchemeとCにコンパイルされます。[12]
参照
参考文献
- ^ Brady, Edwin (2007 年 12 月 12 日). 「Index of /~eb/darcs/Idris」.セントアンドリュース大学コンピュータサイエンス学部. 2008 年 3 月 20 日時点のオリジナルよりアーカイブ。
- ^ 「リリース 1.3.4」。GitHub 。 2022年12月31日閲覧。
- ^ 「Idris 2 バージョン 0.7.0 リリース」。GitHub。2024年4 月 20 日閲覧。
- ^ ab 「一意性タイプ」。Idris 1.3.1 ドキュメント。2019年 9 月 26 日閲覧。
- ^ abc 「Idris、依存型を持つ言語」。2014年10月26日閲覧。
- ^ 「Elaborator Reflection – Idris 1.3.2 ドキュメント」 。2020年4 月 27 日閲覧。
- ^ 「コード生成ターゲット – Idris 最新ドキュメント」。docs.idris-lang.org。
- ^ 「よくある質問」。2015年7月19日閲覧。
- ^ 「構文ガイド – Idris 1.3.2 ドキュメント」 。2020年4 月 27 日閲覧。
- ^ 「Erasure By Usage Analysis – Idris 最新ドキュメント」。idris.readthedocs.org。
- ^ 「ベンチマーク結果」。ziman.functor.sk。
- ^ “idris-lang/Idris2”. GitHub . 2021年4月11日閲覧。
外部リンク
- 公式ウェブサイト、ドキュメント、よくある質問、例
- HackageリポジトリのIdris
- Idris 言語のドキュメント (チュートリアル、言語リファレンスなど)
