2010年10月11日
C#でunfold
T_GYOUTENさんの記事
に触発されて、C#で3つのUnfold関数を書いてみました。
名前をどうしようか迷ったのですが、Unfoldクラスを定義し、そこに Do メソッドを定義
することにしました。一つの機能しかないstaticクラスを作る時には、名前をどうするか
悩みますね。
引数の順番は、F#とは逆にし、初期値, generator の順にしました。
まずは、一つ目のバージョンのUnfold.Doメソッド
使い方はこんな感じ。
true, false が繰り返されます。
generatorが null を返すと終了しますが、Tが値型の場合、nullがとれないので、
無限に繰り返すことになります。
2つめは、繰り返し条件を指定できるバージョン。これならば、値型でも有限のシーケンスを 得ることが できます。
使い方です。
1 2 4 8 16 32 64 128 256 512 と表示されます。
最後は、最も汎用性のあるバージョンで、F#のSeq.unfoldとほぼ同等のものです。
Tupleを使っているので、ちょっと分かりにくいかもしれませんが、
これだと、初期値に与える型と、戻り値の各要素の型を別のものにすることができます。
以下、使い方の例です。
true, false を繰り返しています。 これだと、最初に示した true, false を返すコードのほうが簡単なので、
このTuple使ったDoメソッドだからできる例を示します。
フィボナッチ数列を求めるコードです。
unfoldは強力ですが、使うにはちょっと慣れが必要ですね。
名前をどうしようか迷ったのですが、Unfoldクラスを定義し、そこに Do メソッドを定義
することにしました。一つの機能しかないstaticクラスを作る時には、名前をどうするか
悩みますね。
引数の順番は、F#とは逆にし、初期値, generator の順にしました。
まずは、一つ目のバージョンのUnfold.Doメソッド
使い方はこんな感じ。
true, false が繰り返されます。
generatorが null を返すと終了しますが、Tが値型の場合、nullがとれないので、
無限に繰り返すことになります。
2つめは、繰り返し条件を指定できるバージョン。これならば、値型でも有限のシーケンスを 得ることが できます。
使い方です。
1 2 4 8 16 32 64 128 256 512 と表示されます。
最後は、最も汎用性のあるバージョンで、F#のSeq.unfoldとほぼ同等のものです。
Tupleを使っているので、ちょっと分かりにくいかもしれませんが、
これだと、初期値に与える型と、戻り値の各要素の型を別のものにすることができます。
以下、使い方の例です。
true, false を繰り返しています。 これだと、最初に示した true, false を返すコードのほうが簡単なので、
このTuple使ったDoメソッドだからできる例を示します。
フィボナッチ数列を求めるコードです。
unfoldは強力ですが、使うにはちょっと慣れが必要ですね。
Posted by gushwell at 21:25│Comments(2)│TrackBack(0)
この記事へのコメント
なるほどC#4.0では、こんな風になるのですね。
話は変わりますが、ただいまgushwellさんのメールマガジンのバックナンバーでLINQ勉強中です。お世話になっております。
話は変わりますが、ただいまgushwellさんのメールマガジンのバックナンバーでLINQ勉強中です。お世話になっております。
Posted by T_GYOUTEN at
2010年10月12日 22:15
C#4.0のカテゴリにしましたが、正確には「.NET Framework4 を使ったコード」でしたね。(^^;
メールマガジンがお役に立っているようで、何よりです。
LINQは、ちょっとしたWebページよりも、詳しい内容になっているんじゃないかと、密かに思っています。
気がついたことがあれば、遠慮なく仰ってください。
メールマガジンがお役に立っているようで、何よりです。
LINQは、ちょっとしたWebページよりも、詳しい内容になっているんじゃないかと、密かに思っています。
気がついたことがあれば、遠慮なく仰ってください。
Posted by Gushwell at
2010年10月13日 00:04