スポンサーサイト

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

F#入門基本編落穂拾い その26 option

option moduleにはOption型の値を操作するメソッドが色々準備されているので、今回はそれを紹介します。 
 
まずは、テスト用の材料としていくつかint option型の値を定義しておきます。
 
let ts = Some(1)
let tn :int option  = None
let tL = [Some(2);None;Some(3);None]
 
val ts : int option = Some 1
val tn : int option = None
val tL : int option list = [Some 2; null; Some 3; null]
 
それでは順番にメソッドを紹介していきます。
 
○ Option.IsSome,Option.IsNone
 
これらは値がSomeかNoneかを調べるメソッドです。
 
> Option.isSome ts;;
val it : bool = true
> Option.isNone ts;;
val it : bool = false
> Option.isSome tn;;
val it : bool = false
> Option.isNone tn;;
val it : bool = true
 
 
○ Option.get
> Option.get;;
val it : ('a option -> 'a) = <fun:clo@6-3>
 
Option.get xでxがSome(v)ならvを返し、xがNoneなら例外を投げます。
 
> Option.get ts;;
val it : int = 1
> Option.get tn;;
System.ArgumentException: The option value was None
 
 
○Option.toList,Option.toArray
 
> Option.toList;;
val it : ('a option -> 'a list) = <fun:clo@4-8>
 
実行例
> Option.toList ts;;
val it : int list = [1]
> Option.toList tn;;
val it : int list = []
 
Option.toArrayも同様です。
 
○Option.bind
 
> Option.bind;;
val it : (('a -> 'b option) -> 'a option -> 'b option) = <fun:clo@7>
 
Option.bind f x で
xがNoneのときはNone,Some(v)のときはf vに評価されます。
 

> Option.bind (fun x -> Some(2*x)) ts;;
val it : int option = Some 2
> Option.bind (fun x -> Some(2*x)) tn;;
val it : int option = None
 
○Option.count
 
> Option.count;;
val it : ('a option -> int) = <fun:clo@11-2>
 
Option.count xでxがSome(_)のときは1,Noneの時は0に評価されます。
 

> Option.count (Some(4));;
val it : int = 1
> Option.count (None);;
val it : int = 0
 
○Option.iter
 
> Option.iter;;
val it : (('a -> unit) -> 'a option -> unit) = <fun:clo@9-4>
 
Option.iter f x でxがSome(v)ならf vを実行して()を返し、xがNoneなら単に()を返します。
 
> Option.iter (fun v -> printfn "%d" v) ts;;
1
val it : unit = ()
 
> Option.iter (fun v -> printfn "%d" v) tn;;
val it : unit = ()
 
たとえば上のtL (= [Some(2);None;Some(3);None])に対し、Some(v)のvの値だけを表示するには次のようにできます。
 
> List.iter (Option.iter (fun v -> printfn "%d" v)) tL;;
2
3
val it : unit = ()
 
 
○Option.fold
 
> Option.fold;;
val it : (('a -> 'b -> 'a) -> 'a -> 'b option -> 'a) = <fun:clo@17-3>
 
fold f s x でxがNoneのときにはs,Some(v)のときはf s v と評価されます。
 
> Option.fold (fun s v -> s + v) 0 (Some(3));;
val it : int = 3
> Option.fold (fun s v -> s + v) 0 None;;
val it : int = 0
 
たとえば上のtL (= [Some(2);None;Some(3);None])に対し、Some(v)のvの値だけの和を求めるには次のようにできます。
 
> List.fold (Option.fold (fun s v -> s + v))  0 tL ;;
val it : int = 5
 
上のOption.iter,Option.foldから分かるように、これらは???.Iter,???.fold用にSome(v)のvの部分だけを抜き出して処理するようにデザインされています。
 
例えばOption.mapを使ってList.map (Option.map (fun v -> 2*v) ) tLとすると次のようになります。
 
> List.map (Option.map (fun v -> 2*v) ) tL ;;
val it : int option list = [Some 4; null; Some 6; null] //この場合nullはNoneのこと
 
このほか同様にOption.forallやOption.exsit等が定義されています。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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