- ※以下はF#のドキュメントが更新されれば不必要になるでしょう。
- 前置きをスキップするときは「Optionモジュールの未掲載関数」からお読みください。
F#はMicrosoftのDon Syme氏が開発したプログラミング言語で、命令型、オブジェクト指向、関数型の要素を併せ持つマルチパラダイム言語と位置付けられています。実装はオープンソースのMITライセンスのもと、githubのリポジトリで公開されています。
実行環境は.NET Frameworkおよび.NET CoreやMonoといったマルチプラットフォームに対応していますが、サポート状況については各プラットフォームごとの情報を参照してください(「F# の概要」など)。
Optionについて
Option
は、検索など結果を得られないかもしれないときの戻り値としてよく利用される型です。結果が存在するときはSome result
(resultが結果)、存在しないときはNone
という値で表します。型名は'T option
('T
はresult
の型名)で表されます。
Some result
からresult
を得るには、match-with
で処理の振り分けを行います。これにより、値がSome result
のときとNone
のとき、それぞれの処理を設定できます。たとえばList.tryFind
関数で得られた結果を表示するには、以下のようにできます。
let findName (name: string) =
// 検索処理(見つからない場合もある)
let result =
["F#"; "C#"; "VB"]
|> List.tryFind (fun (s: string) -> s.IndexOf(name) >= 0)
// 処理の振り分け
match result with
| Some n -> printfn "%Aが見つかりました" n
| None -> printfn "見つかりませんでした"
findName "#" // "F#"が見つかりました
findName "PS" // 見つかりませんでした
Optionのメンバー関数
Option
型の定義はtype Option<'T> = None | Some of 'T
とtype 'T option = Option<'T>
ですが、これ以外にメンバー関数も実装されています(詳細)。メンバー関数には、通常のメンバー関数とstatic
なメンバー関数があります。
let opt = Some 1
opt.IsSome // true
opt.IsNone // false
opt.Value // 1
Option<int>.None // 通常はNoneで表す
Option<int>.Some 1 // 通常はSome 1で表す
Optionモジュールの未掲載関数
Option<'T>
型の値(以下Option
値)に対して実行できる関数には、メンバー関数のほかにOptionモジュールの関数もあります。これらは引数にOption
値を設定して実行されます。関数にはF#ドキュメントに掲載されていない__未掲載関数__も存在します。ここでは2017/8/18更新分のドキュメントに掲載されていない関数を紹介していきます。
Option.contains 値 Option値
('a -> 'a option -> bool) when 'a : equality
Some a
におけるa
の値が引数と一致するかを確かめ、true
かfalse
のどちらかを判定します。Option
値がNone
であれば必ずfalse
です。
Option.contains 3 (Some 3) // true
Option.contains 3 (Some 1) // false
Option.contains 3 (None) // false
Option.defaultValue デフォルト値 Option値
'a -> 'a option -> 'a
Option
値のSome a
からa
を取得できるときはa
を、できないときは引数のデフォルト値を得られる関数です。a
の型とデフォルト値の型とを同一にしてください。
Option.defaultValue -1 (Some 3) // 3
Option.defaultValue -1 (None) // -1
Option.defaultWith デフォルト関数 Option値
(unit -> 'a) -> 'a option -> 'a
Option.defaultValue
と似ていますが、引数のOption
値がNone
のときはデフォルト関数を実行します。この関数に引数はありません。また、関数の戻り値の型はSome a
のa
の型と同一にしてください。
Option.defaultWith (fun _ -> -1) (Some 3) // 3
Option.defaultWith (fun _ -> -1) None // -1
Option.map2 関数 Option値a Option値b
('a -> 'b -> 'c) -> 'a option -> 'b option -> 'c option
Option
値aがSome a
で、Option
値bがSome b
のとき、a
とb
の値を引数とする関数を実行します。この結果にSome
がつけられ、map2
関数の結果となります。どちらかのOption
値がNoneのときは結果も必ずNone
となります。
Option.map2 (fun x y -> x + y) (Some 2) (Some 3) // Some 5
Option.map2 (fun x y -> x + y) (Some 2) None // None
Option.map2 (fun x y -> x + y) None (Some 3) // None
Option.map3 関数 Option値a Option値b Option値c
('a -> 'b -> 'c -> 'd) -> 'a option -> 'b option -> 'c option -> 'd option
Option
値aがSome a
、Option
値bがSome b
、Option
値cがSome c
のとき、a
、b
、c
の値を引数とする関数を実行します。この結果にSome
がつけられ、map3
関数の結果となります。どれかのOption
値がNoneのときは結果も必ずNone
となります。
Option.map3 (fun x y z -> x + y + z) (Some 2) (Some 3) (Some 4) // Some 9
Option.map3 (fun x y z -> x + y + z) (Some 2) (Some 3) None // None
Option.map3 (fun x y z -> x + y + z) (Some 2) None (Some 4) // None
Option.map3 (fun x y z -> x + y + z) None (Some 3) (Some 4) // None
Option.orElse デフォルトOption値 Option値
'a option -> 'a option -> 'a option
Option
値がSome a
なら結果もそのまま、None
であれば結果がデフォルトOption値となります。2つの引数の型はどちらも同一にしてください。
Option.orElse (Some -1) (Some 3) // Some 3
Option.orElse (Some -1) None // Some -1
Option.orElseWith デフォルトOption関数 Option値
(unit -> 'a option) -> 'a option -> 'a option
Option.orElse
と似ていますが、Option
値がNone
のときはデフォルトOption
関数の結果となります。この関数に引数はありません。結果とOption
値の型は同一にしてください。
Option.orElseWith (fun _ -> Some -1) (Some 3) // Some 3
Option.orElseWith (fun _ -> Some -1) None // Some -1
Option.ofNullable Nullable値
Nullable<'a> -> 'a option (詳細略)
Nullable<'T>型の引数を'T option
型に変換します。具体的には、値を持つ(HasValue = true
の)Nullable
オブジェクトはSome
、値を持たない(HasValue = false
の)Nullable
オブジェクト(null
相当)はNone
に変換されます。
open System
Option.ofNullable (Nullable 1) // Some 1
Option.ofNullable (Nullable<int>()) // Option<int>.None (int option型のNone)
ドキュメントが更新されたら、このページは不要になると思いますが、その時までご覧になった方々の参考になればと思います。