これはYAHTから運動するための私の解決策です:
演習 4.6 コンストラクタに応じて、1、2、3、または 4 つの要素を保持できるデータ型タプルを記述します (つまり、引数の数ごとに 1 つずつ、4 つのコンストラクタが必要です)。また、タプルを取り、その位置の値のみを返す関数 tuple1 から tuple4 も提供します。数値が有効な場合は Nothing を返します (つまり、2 つの要素のみを保持するタプルで tuple4 を要求します)。
最初の行を書いたとき、C# に比べてシンプルであることに興奮しました
データ Tuplex abcd = Tuple1 a | Tuple2 ab | Tuple3 abc | Tuple4 abcd -- class Tuplex<a,b,c,d> { -- Tuplex(a p1){ _p1 = p1; } -- Tuplex(a p1, b p2){ _p1 = p1; _p2 = p2; } -- Tuplex(a p1, b p2, c p3){ _p1 = p1; _p2 = p2; _p3 = p3; } -- Tuplex(a p1, b p2, c p3, d p4){ _p1 = p1; _p2 = p2; _p3 = p3; _p4 = p4; } -- public Nullable<a> _p1; -- public Nullable<b> _p2; -- public Nullable<c> _p3; -- public Nullable<d> _p4; -- }
C#だとどのフィールドにも問題なくアクセスできますが、ここでは「アクセサ関数」を書くべきですよね?そして、ここのコードの量は私を悲しくさせます。
ここで短いコードを使用できますか?
tuple1 ∷ Tuplex abcd → たぶん a tuple2 ∷ Tuplex abcd → たぶん b tuple3 ∷ Tuplex abcd → たぶん c tuple4 ∷ Tuplex abcd → たぶん d tuple1 (Tuple1 a) = ただ a tuple1 (Tuple2 ab) = ただ tuple1 (Tuple3 abc) = ただ tuple1 (Tuple4 abcd) = ただ tuple2 (Tuple1 a) = なし tuple2 (Tuple2 ab) = ただ b tuple2 (Tuple3 abc) = ただ b tuple2 (Tuple4 abcd) = ただ b tuple3 (Tuple1 a) = なし tuple3 (Tuple2 ab) = なし tuple3 (Tuple3 abc) = ただ c tuple3 (Tuple4 abcd) = ただ c tuple4 (Tuple1 a) = なし tuple4 (Tuple2 ab) = なし tuple4 (Tuple3 abc) = なし tuple4 (Tuple4 abcd) = ただ d -- 単体テスト prop_tx1 = tuple1 (Tuple1 4) ≡ ちょうど 4 prop_tx2 = tuple1 (Tuple2 4 'q') ≡ ちょうど 4 prop_tx3 = tuple2 (Tuple1 4) ≡ (Nothing ∷ Maybe Char) prop_tx4 = tuple2 (Tuple2 4 'q') ≡ 'q' のみ