F#で半角数字を全角に変換するメソッドを書くというテストです。
まずは美しくない叩き台コード
let han2zen num = let tbl = [|'0';'1';'2';'3';'4';'5';'6';'7';'8';'9'|] let c_num (n:char) = int(byte(n) - byte('0')) let snum = string(num) let a = snum.ToCharArray() let a2 : int[] = Array.map c_num a let a3 : char[] = Array.map (fun (i:int) -> tbl.[i]) a2 new System.String(a3)
これをパイプラインを導入して直すと...
let han2zen num = let tbl = [|'0';'1';'2';'3';'4';'5';'6';'7';'8';'9'|] let str_num = string(num) let a = str_num.ToCharArray() |> Array.map (fun n -> tbl.[int(byte(n) - byte('0'))]) new String(a)
ちょっと直して ...
let han2zen num = let tbl = [|'0';'1';'2';'3';'4';'5';'6';'7';'8';'9'|] let new_string (a : char[]) = new String(a) string(num).ToCharArray() |> Array.map (fun n -> int(byte(n) - byte('0'))) |> Array.map (fun n -> tbl.[n]) |> new_string
F#関係なく、テーブルなんか使わなくて良いことに気づいてロジックを修正
let han2zen num = let new_string (a : char[]) = new String(a) string(num).ToCharArray() |> Array.map (fun n -> char(int(byte(n) - byte('0')) + int('0'))) |> new_string
うん。ちょっと納得。でも、まだまだF#のスキルが足りないので、もう少し学習が必要です。
// 関数をテストするコード printfn "%A" <| han2zen 1234 //結果→ "1234"