パターンを軽く解説します。説明が分かりやすく、ぜひ紹介したいと思いました。よる実行結果を示します。引数を一つとり、以下のように動作する関数を定義しましょう。引数がタプルやベクトル(1次元配列)なら、それ自身を返します。引数が数(スカラー)なら、1つの要素のベクトルを作って返します。次のように、定義できます。右側)を繰り返し記述します。用いてメソッドを一覧しましょう。REPL[4]:1では、関数の動作を確かめましょう。タプル(1.0,)正しく動作していますね。対しても、タプルまたはベクトルと同じように振る舞うようにしましょう。右側)を繰り返し記述することになります。使ってもよいでしょう。型の例のように、メソッド定義をやはり繰り返す必要があります。どちらも、「拡張可能(extensible)」ではありません。この例では、簡単なメソッド定義を繰り返すのは容易ですが、定義が複雑になると、記述の誤りも起こりうるでしょう。パターンを用いて、「拡張可能な」関数を書いてみましょう。関数の挙動を整理し、それぞれの挙動に対応する型を定義します。例題では、二通りの挙動があります。リストのような挙動と、そうでない挙動です。end次に、引数の型から、トレイツ型のインスタンスを返す関数を定義します。例題のトレイツ関数は、こうなります。インスタンスを作ります。REPL[22]:1最後に、各々のトレイツ型(のインスタンス)に対して、その挙動を定義します。ユーザが呼び出す関数は、引数からトレイツ型を得て、そのトレイツ型に対応する挙動を、引数とともに呼び出すように定義します。例題は、以下のように整理されました。ユーザが呼び出すのは、引数1つのメソッドです。渡してトレイツ型を得ます。トレイツ型と、元の引数で、引数2つのメソッドを呼出します。引数2つのメソッドが、各トレイツ型に対する挙動を定義します。REPL[25]:1動作を確認しましょう。2どちらも、題意の挙動が得られました。このようにしておけば、別の型に対応させることも簡単です。その型に対するトレイツ関数を用意するだけです。型を、配列同様に振る舞わせるには、こうします。aslist("abc")"abc"ところで、「トレイツ関数」を追加すると、間接コスト(オーバーヘッド)を増やす恐れがあります。コンパイル結果を表示させてみましょう。消化されて、なくなってしまいました。引数を、そのまま返します。引数に数を与えた場合のコンパイル結果は、こうなります。%1少しわかりにくいですが、配列をメモリ確保して、引数の値を書き込んでいます。消化されて、消えてしまいました。いうわけで、「トレイツ関数」の追加は、間接コストとはならないでしょう。最適化コンパイラの威力ですね。先生は、上で紹介した実装を提案しています。渡しているので、更に分かりにくいのですが)。)で紹介しましたが、多次元配列の要素の添字指定には、2種類の書き方があります。そこで、(多次元)配列の型を定義した場合には、どちらを使うかを指定することになっています。