読者です 読者をやめる 読者になる 読者になる
ようこそ。睡眠不足なプログラマのチラ裏です。

F#でもジェネリックオペレータみたいな。2つの引数を取る関数を中置演算子にしちゃうよ。

プログラミング F# イディオム

以前、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#初心者です。
|