Tuple

http://d.hatena.ne.jp/akiramei/20040822#p1を参考にさせていただいて、Tupleを実装してみる。Generic Methodを使えば、そこそこ使えるものになるかな。

using System;
using System.Collections.Generic;
using System.Text;

namespace ML {
    public static class Tuple {
        static public Tuple<T1> Make<T1>(T1 A) {
            return new Tuple<T1>(A);
        }

        static public Tuple<T1, T2> Make<T1, T2>(T1 A, T2 B) {
            return new Tuple<T1, T2>(A, B);
        }

        static public Tuple<T1, T2, T3> Make<T1, T2, T3>(T1 A, T2 B, T3 C) {
            return new Tuple<T1, T2, T3>(A, B, C);
        }

        static public Tuple<T1, T2, T3, T4> Make<T1, T2, T3, T4>(T1 A, T2 B, T3 C, T4 D) {
            return new Tuple<T1, T2, T3, T4>(A, B, C, D);
        }

        static public Tuple<T1, T2, T3, T4, T5> Make<T1, T2, T3, T4, T5>(T1 A, T2 B, T3 C, T4 D, T5 e) {
            return new Tuple<T1, T2, T3, T4, T5>(A, B, C, D, e);
        }
    }

    public struct Tuple<T1> {
        public T1 A;

        public Tuple(T1 A) {
            this.A = A;
        }

        public void Bind(ref T1 A) {
            A = this.A;
        }
    }

    public struct Tuple<T1, T2> {
        public T1 A;
        public T2 B;

        public Tuple(T1 A, T2 B) {
            this.A = A;
            this.B = B;
        }

        public void Bind(ref T1 A, ref T2 B) {
            A = this.A;
            B = this.B;
        }
    }

    public struct Tuple<T1, T2, T3> {
        public T1 A;
        public T2 B;
        public T3 C;

        public Tuple(T1 A, T2 B, T3 C) {
            this.A = A;
            this.B = B;
            this.C = C;
        }

        public void Bind(ref T1 A, ref T2 B, ref T3 C) {
            A = this.A;
            B = this.B;
            C = this.C;
        }
    }

    public struct Tuple<T1, T2, T3, T4> {
        public T1 A;
        public T2 B;
        public T3 C;
        public T4 D;

        public Tuple(T1 A, T2 B, T3 C, T4 D) {
            this.A = A;
            this.B = B;
            this.C = C;
            this.D = D;
        }

        public void Bind(ref T1 A, ref T2 B, ref T3 C, ref T4 D) {
            A = this.A;
            B = this.B;
            C = this.C;
            D = this.D;
        }
    }

    public struct Tuple<T1, T2, T3, T4, T5> {
        public T1 A;
        public T2 B;
        public T3 C;
        public T4 D;
        public T5 E;

        public Tuple(T1 A, T2 B, T3 C, T4 D, T5 E) {
            this.A = A;
            this.B = B;
            this.C = C;
            this.D = D;
            this.E = E;
        }

        public void Bind(ref T1 A, ref T2 B, ref T3 C, ref T4 D, ref T5 E) {
            A = this.A;
            B = this.B;
            C = this.C;
            D = this.D;
            E = this.E;
        }
    }
}
public static class Program {
  public static void main(string [] args) {
    Tuple<int,string> t = ML.Tuple.Make(1, "hello");           => (1,"hello") : int * string
    
    int i = 0;
    string s = "";
    t.Bind(ref i, ref s);                                      => i=1, s="hello"
  }
}

パターンマッチがないので、あまり使いではないが、わざわざクラスを定義するまでもないpairを保存するときに使えるかも。

なんで、ほとんどid:akirameiさんのと同じコードを書いたのかというと、次の日使うから。