スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Prev.    Category    Next 

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 を使用したコンパイル方法については以前の記事を見て下さい。


関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
15位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
2位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

09月 | 2017年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

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。