スポンサーサイト

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

F#によるLinq to Obj入門 (10) Concat

Concatは英単語のconcatenate(を鎖状につなぐ)の最初6文字を取り出したものです。
 
ということで使い方は簡単
 

 
> Enumerable.Concat (seq[1;2;3], seq[4;5]);;
val it : seq<int> = seq [1; 2; 3; 4; ...]
 
> (seq[1;2;3]).Concat (seq[4;5]);;
val it : seq<int> = seq [1; 2; 3; 4; ...]
 
Enumerable.Concatを自前で書くと例えば次の様になります。
 
> let myConcat seq1 seq2 =
    seq{ for e1 in seq1 do
            yield e1
         for e2 in seq2 do
            yield e2      };;
 
val myConcat : seq<'a> -> seq<'a> -> seq<'a>
 
使用例
 
> myConcat (seq[1;2;3]) (seq[4;5]);;
val it : seq<int> = seq [1; 2; 3; 4; ...]
 
一方Seqモジュールのconcatは少し異なっていて、こちらは引数がSeq<Seq<'a>>型となります。
 
> Seq.concat;;
val it : (seq<#seq<'b>> -> seq<'b>) = <fun:clo@22>
 

> let res1 = Seq.concat (seq[(seq[1;2;3]);(seq[4;5]);(seq[6;7]);(seq[8])]);;
val res1 : seq<int>
 
> res1 |> Seq.iter (fun x -> printf "%A :" x) ;;
1 :2 :3 :4 :5 :6 :7 :8 :val it : unit = ()
 
すなわちseq<_>型を要素とするシークエンスから、一段階要素を取り出す作用となります。
 
自前で定義してみるとこちらは次のようになります。
 
> let mySeqConcat1 seqSeq =
    seq{ for subSeq in seqSeq do
            for ele in subSeq do
                yield ele  };;
 
val mySeqConcat1 : seq<#seq<'b>> -> seq<'b>
 
> mySeqConcat1 (seq[(seq[1;2;3]);(seq[4;5]);(seq[6;7]);(seq[8])]);;
val it : seq<int> = seq [1; 2; 3; 4; ...]
 
yield!を用いると次のようになります。
 
> let mySeqConcat2 seqSeq =
    seq{ for subSeq in seqSeq do
             yield! subSeq      };;
 
val mySeqConcat2 : seq<#seq<'b>> -> seq<'b>
 
> mySeqConcat2 (seq[(seq[1;2;3]);(seq[4;5]);(seq[6;7]);(seq[8])]);;
val it : seq<int> = seq [1; 2; 3; 4; ...]
 
(おまけ)
前回自前で定義してみたmySelectMany1
 
let mySelectMany1 source selector =
    seq{ for s in source do
            let temp = s |> selector 
            for t in temp do
                yield t}
 
はSeq.concatを使うと
 
> let mySelectMany2 source (selector:'a -> seq<'a>) =
     let t = Seq.map (fun s -> selector s) source
     Seq.concat t;;
 
val mySelectMany2 : seq<'a> -> ('a -> seq<'a>) -> seq<'a>
 
> let res2 = mySelectMany2 (seq[10;20;30]) (fun x ->seq[x+1;x+2;x+3]);;
val res2 : seq<int>
 
> res2 |> Seq.iter (fun x -> printf "%A :" x) ;;
11 :12 :13 :21 :22 :23 :31 :32 :33 :val it : unit = ()
 
となり 
 
yield!を使うと
 
> let mySelectMany3 source selector =
    seq{ for s in source do
            yield! (s |> selector) 
            };;
 
val mySelectMany3 : seq<'a> -> ('a -> #seq<'c>) -> seq<'c>
 
> let res3 = mySelectMany3 (seq[10;20;30]) (fun x ->seq[x+1;x+2;x+3]);;
val res3 : seq<int>
 
> res3 |> Seq.iter (fun x -> printf "%A :" x) ;;
11 :12 :13 :21 :22 :23 :31 :32 :33 :val it : unit = ()
 
となります。
スポンサーサイト

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

コメントの投稿

非公開コメント

たぶん・

とうことで→ということで

No title

訂正しました。ありがとうございます。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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