スポンサーサイト

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

F#によるLinq to Obj入門 (16) Range Repeat Empty

○Range
 
Range は開始の整数値と個数を与えて、整数のシークエンスを返します。
 
> Enumerable.Range(2, 10)
 |> Seq.iter (fun x -> printf "%d :" x);;
 
2 :3 :4 :5 :6 :7 :8 :9 :10 :11 :val it : unit = ()
 
自分で定義してみると、例えば次の様になります。
 
> let myRange init num = Seq.unfold
                         (fun (v,counter) ->
                               if counter < num then 
                                    Some(v,(v+1,counter+1))
                               else None)           
                         (init,0);;
 
val myRange : int -> int -> seq<int>
 
使用例
 
> myRange 2 5
|> Seq.iter (fun x -> printf "%A :" x);;
 
2 :3 :4 :5 :6 :val it : unit = ()
> myRange -1 5
|> Seq.iter (fun x -> printf "%A :" x);;
 
-1 :0 :1 :2 :3 :val it : unit = ()
 
なおSeq.unfoldについての詳細はこちらをご覧ください。
http://fsharpandenglishword.blog83.fc2.com/blog-entry-53.html
 
Seqモジュールでは例えばSeq.initを用いると同じようなことが実現できます。
 
Seq.init toExclusive (f : int -> 'a)で、0から(toExclusive-1)までの整数値がfに渡され、fを適用した結果のシークエンスが返されます。
 

 
> Seq.init 3 (fun i -> i);;
val it : seq<int> = seq [0; 1; 2]
 
> Seq.init 3 (fun i -> 2.0*(float)i);;
val it : seq<float> = seq [0.0; 2.0; 4.0]
 
 
○Repeat
 
Repeatは値を回数分繰り返すシークエンスを生成します。
 
> Enumerable.Repeat(-1,4);;
val it : seq<int> = seq [-1; -1; -1; -1]
 
> Enumerable.Repeat(1.0,3);;
val it : seq<float> = seq [1.0; 1.0; 1.0]
 
Seq.initを利用して自分で定義してみると、例えば次の様になります。
 
> let myRepeat v count =
    Seq.init count (fun _ -> v);;
 
val myRepeat : 'a -> int -> seq<'a>
 
> myRepeat -1 4;;
val it : seq<int> = seq [-1; -1; -1; -1]
 
○Empty
 
Emptyは、指定された型の空のシーケンスを返します
 
> let myIntEmpty = Enumerable.Empty<int>();;
 
val myIntEmpty : seq<int> = [||]
 
型注釈の形でも使えます。
 
> let myIntEmpty2:seq<int> = Enumerable.Empty();;
 
val myIntEmpty2 : seq<int> = [||]
 
Seqモジュールでは次のようにできます。
 
> let myIntEmpty3 = Seq.empty<int>;;
val myIntEmpty3 : seq<int>
> myIntEmpty3;;
val it : seq<int> = seq []
 
また次のようにもできます。
 
> let myIntEmp3:seq<int> = seq[];;
val myIntEmp3 : seq<int> = []
 
> let myIntEmp4 = seq<int>[];;
val myIntEmp4 : seq<int> = []
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

余計なお世話

私も、myRange 考えてみました。
let myRange init n = Seq.take n { init..System.Int32.MaxValue }

>(fun i -> i)
id がそういう関数ですので、
Seq.init 3 id
のように書けます。

No title

ワンラインですっきりで、いいですね。これは全然思いつきませんでした。膝を打ちます。
プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。