ことをヴァリアントだとか列挙子だとかコンストラクタだとか呼びます。値を作るにはこれらのコンストラクタを使います。関数のように使えます。扱ったので馴染んでいますね。REPLで少し遊んでみましょう。Leafおっと、いきなり起こられました。部分の型が決まらないのです。あることを明示しましょう。キーワードではなくただの関数です。a型を関数の引数に渡せてしまうところがIdrisの特徴です。ノードの方を試してみましょう。ノードを使うといくらでも複雑な構造を作れます。なってることが分かるかと思います。ところで、以下のような定義も実行できてしまいます。Integerこれは3の右の子に2がきているので今回扱おうとしている二分木としては不適格です。不適格なデータを作れてしまう問題はデータ型だけではどうしようもないのでプログラマが気をつける必要があります。挿入このデータ型に対して挿入を実装してみましょう。返すのでこうなりそうです。a実装の方はリーフかノードかで分岐が発生します。以下のように書けるでしょう。...しかし引数で分岐するときは別の記法があります。以下のように書けるのです。...こちらの方がより宣言的で読みやすいスタイルだとされています。数学の記法に似ていますね。エディタサポート今の実装は実は自動化できます。型を書いたところまで巻き戻ってみましょう。\d)を打つとこうなります。?insert_rhs変数名が適当ですが定義のモックが自動生成されました。マークで始まるのは穴(Hole)と呼ばれ、「あとで実装する」のマークです。詳しくはドキュメントを読んで下さい。名前はおいておいて、エディタサポートの話を続けます。\c)を打つとこうなります。?insert_rhs_2ここまで自動生成できました。と適当なのが気になりますよね。自動生成される名前を制御するにはこのチュートリアルを大きく超える内容が必要です。ディレクティブを、ヴァリアントにはGADTを使ってそれぞれこう定義したら目的を達成できます。tree2これで生成したコードは以下です。?insert_rhs_2記法やコンパイラ補助の違いだけで、元の記法もこちらの記法も同じデータ型を定義しているので盲目的に定義を置き換えてしまうのも手です。これから実装していきましょう。新しい値を持ったノードで置き換えるのでした。方は大きいか小さいかで分岐が発生しますね。先程は触れませんでしたが既に同じ値がある場合も新しくノードを作って返すことにします。