F#でもジェネリックオペレータみたいな。2つの引数を取る関数を中置演算子にしちゃうよ。
以前、C#で「演算子オーバーロードを活用してジェネリックオペレータを作る。それは即席自作演算子的な何か。」を書きました。
F#の方がより利用価値が高いっぽいかなーと思って、F#でも書いてみました。
#light open System (* T Combinator Thrush 鵺鳥 λab.ba *) let T a b = b a;; (* I* Combinator Identity Bird Once Removed 自己鳥* λabc.abc *) let Iaster a b = a b;; (* ジェネリックオペレータとして働く演算子を定義 *) let (|<) = T;; let (>|) = Iaster;; min (max (min 1 4) 6) 7 |> printf "%d\r\n";; 1 |<min>| 4 |<max>| 6 |<min>| 7 |> printf "%d\r\n";; printf "\r\n";; let rec pow x n = if n = 1 then x else x * pow x (n - 1);; pow (pow (pow 3 2) 2) 3 |> printf "%d\r\n";; 3 |<pow>| 2 |<pow>| 2 |<pow>|3 |> printf "%d\r\n";; printf "\r\n";; type hoge(x:string) = class member h.value = x; end;; let h1 = new hoge("F#");; let h2 = new hoge("初心者です。");; let union (a:hoge) (b:hoge) = a.value + b.value;; h1 |<union>| h2 |> printf "%s\r\n";; Console.ReadKey();
実行結果
>|cs||
6
6
531441
531441
F#初心者です。
|