スポンサーサイト

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

F#入門基本編落穂拾い その2 (Set型)

今回はSet型を紹介します。
 
Set型というのは、「数学でいうところの集合」のF#での表現です。
これはimmutable(不変)です。よって、要素の変更等に<-は使用できませんし、何らかの操作を加えた場合はlet束縛で新しい識別子を導入する等の必要があります。
また、内部的に同じ要素は除去されるという性質があります。
まずは作成から始めます。
 
> set [1;2;3];;
val it : Set<int> = seq [1; 2; 3]
 
> set [|1;2;3|];;
val it : Set<int> = seq [1; 2; 3]
 
というように、listやarrayから簡単に作成することができます。
 
またリストや配列等からの変換関数も充実してます。
 
let t = [1;2;3]
let u = Set.ofList t
としておくと
 
> u;;
val it : Set<int> = seq [1; 2; 3]
 
空のSetはSet.emptyで作成できます。
> Set.empty;;
val it : Set<'a> when 'a : comparison = seq []
 
次に要素の追加です。
 
let t = Set [1;2;3]  //sは小文字でも大丈夫です。
let u = Set.add 10 t
とすると
 
> u;;
val it : Set<int> = seq [1; 2; 3; 10]
 
となります。
要素の重複なく作られます。
 
let t = Set [1;2;3;3]
 
> t;;
val it : Set<int> = seq [1; 2; 3]
 
let u = Set.add 2 t
とすると
 
> u;;
val it : Set<int> = seq [1; 2; 3]
 
(順番に関係なく)要素が等しいとき等しいとされます。
 
> Set[1;2;3] = Set[3;2;1];;
val it : bool = true
 
(Setは内部的にはソートされています。)
 
要素数はSet.countで求めます。
 
> Set.count (Set [1;1;2;2;3;3]);;
val it : int = 3
 
それでは次に集合らしい演算を紹介していきます。
 
(1)Intersection(共通部分、交わり、積集合)
 
> Set.intersect (Set [1;2;3;4]) (Set[3;4;5;6]);;
val it : Set<int> = seq [3; 4]
 
(2)union (結び、和集合)
 
> Set.union (Set [1;2;3]) (Set[3;4]);;
val it : Set<int> = seq [1; 2; 3; 4]
 
演算子+としても定義されています。
 
> (Set [1;2;3]) + (Set[3;4]);;
val it : Set<int> = seq [1; 2; 3; 4]
 
(3)Subtract (差)
 
演算子-として定義されています。
 
> (Set [1;2;3;4]) - (Set[3;4;5;6]);;
val it : Set<int> = seq [1; 2]
 
その他、foldやmap等リストでよく使われる関数も定義されています。
例えばSet.forallは
 
> Set.forall;;
val it : (('a -> bool) -> Set<'a> -> bool) = <fun:clo@0>
 
と定義されていて、要素に対し真偽を返す関数が、すべての要素に対し真を返す時、真を返します。
 

 
> Set.forall (fun x -> x < 7) (Set [2;4;5]);;
val it : bool = true
 
例えばSet.containsは
 
> Set.contains;;
val it : ('a -> Set<'a> -> bool) = <fun:clo@0-1>
 
と定義されていて、Set.contains x S でxがSの要素の時、真を返します。
 

 
> Set.contains 3 (Set [1;2;3]);;
val it : bool = true 
 
それでは、この二つを使って集合Aが集合Bに含まれているとき真を返す関数を作ってみてください。
(注意)集合Aと集合Bが等しいときも「集合Aは集合Bに含まれる」と考えます。
 
(解答例)
 
let MyisSubset A B =
    let isElementB x = Set.contains x B
    Set.forall (isElementB) A 
    
この働きをするメソッドはライブラリにも準備されていてSet.isSubsetという名前です。
 
> Set.isSubset (Set [1;3]) (Set [1;2;3;4]);;
val it : bool = true
 
> Set.isSubset (Set [1;3]) (Set [1;3]);;
val it : bool = true
 
集合Aは集合Bに含まれていて、集合Aと集合Bが等しくない(集合Aが集合Bの真部分集合)の場合だけ、trueを返すのがSet.isProperSubsetです。
 
> Set.isProperSubset (Set [1;3]) (Set [1;2;3;4]);;
val it : bool = true
 
> Set.isProperSubset (Set [1;3]) (Set [1;3]);;
val it : bool = false
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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