これは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' のみ