C# でのカリー化の使用

関数型プログラミングにはカリー化と呼ばれる手法があります。 C# は関数型言語ではありませんが、これを知っていると LINQ などの高階関数を使った処理に役に立ちます。
今回は C# でカリー化をやる方法について説明します。

カリー化

カリー化というのは 2 つ以上の引数を持つ関数を 1 つの引数の関数の組み合わせになおす ことを言います。

次のような 2 つの引数を取る関数をカリー化してみます。
static int Plus(int a, int b)
{
    return a + b;
}
カリー化は戻り値として無形関数(匿名メソッドラムダ式)を返すことによって実現します。
static Func<int, int> CurriedPlus(int a)
{
    return (b) => a + b;
}
C# は静的型付けなので型を指定する必要があります。 戻り値の Func<int, int> int(1 つ目) を引数として int(2 つ目) を返す関数を表しています。
また、 戻り値の関数内では関数内でローカルな引数 a を使っていますが、 クロージャーという技術によって、うまいこと残してくれるようになっています。


元の関数(Plus)を使ってカリー化を行う場合には次のようになります。
static Func<int, int> CurriedPlus2(int a)
{
    return (b) => Plus(a, b);
}
Plus(2, 3) と書いていたものが CurriedPlus(2)(3) と書けるようになりました。これがカリー化です。
Console.WriteLine("{0}", Plus(2, 5));           // 7
Console.WriteLine("{0}", CurriedPlus(2)(5));    // 7

カリー化した関数を使う

カリー化した関数を作りましたが、ただそれだけだと「それがなんの役に立つの?」と思われるかもしれません。 そこで実際に使ってみましょう。


カリー化した関数は LINQ のように関数を渡して処理を行う場面で使用します。
そういった高階関数を使ったデータ処理自体の利点については以前の記事を見て下さい。 例として、次のような LINQ を使ったデータ処理があったとします。
var src = new[] {1, 2, 3, 4};
Console.WriteLine("{0}", Dump(src.Select(p => 2 + p )));     // {3, 4, 5, 6}
ここで、カリー化した関数を使ってみます。
Console.WriteLine("{0}", Dump(src.Select(CurriedPlus(2))));  // {3, 4, 5, 6}
map は一つの引数の関数のみを受け付けるのですが、関数がカリー化してあることによって、そこに関数を渡せるようになっています。こういった関数を求められた型にあわせて当てはめることをバインディングと呼んだりもします。
バインディング自体は C++ などにもあり、やり方はいろいろのですが、カリー化した関数を使う方法は見やすく、柔軟性も高いのではないかと思います。

サンプルコード

説明で使用したサンプルのコードは以下のリンクからダウンロード(リンク先を保存)できます。 コンパイルする場合は以下のコマンドを実行します。
 > csc CurriedSample.cs
csc.exe を使用したコンパイル方法については以前の記事を見て下さい。


FC2 Management
 

Word の変更履歴を消す

Word では修正内容を履歴として残すことができます。
それはそれで役に立つのですが、もう履歴はいらないという時もあります。 今回はそんな時に履歴内容を消す方法についてです。



まず、変更履歴を残す方法です。
[校閲] タブの [変更履歴の記録] を選択すると履歴を記録し始めます。
word_hist_start.png



もう一度 [変更履歴の記録] を押して、選択状態を解除すると記録するのをやめます。ただ、一度記録した履歴は消えません。
このままだとファイルを再度開いた場合に履歴情報を表示する状態になっているので、ちょっと面倒です。


こういった場合には同じ [校閲] タブにある [変更箇所] グループの [承諾] を押すと変更が受け入れられて、 記録された履歴が無くなります。

word_hist_end.png




 

Word でページをまたがった表にもタイトルを付ける

Word で長い表を書いた場合などには、表が次のページにまたがることがあります。 今回はこのまたがった表の方にもタイトルを付ける方法についてです。



次のようなページにまたがった表があったとします。

word_header.png

ここで表のタイトルとしている行にカーソルを合わせ、右クリックから [表のプロパティー] を選択します。

word_header_menu.png

表示されたダイアログの [行] タブにある [各ページにタイトル行を表示する] の項目にチェックを入れます。

word_header_dialog.png


次ページの表の先頭にもタイトルが表示されるようになります。

word_header_result.png


 
このページをシェア
アクセスカウンター
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

09月 | 2014年10月 | 11月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。