LoginSignup
5
3

More than 5 years have passed since last update.

ここにもあった... F#ドキュメントには未掲載のOptionの関数

Posted at
  • ※以下はF#のドキュメントが更新されれば不必要になるでしょう。
  • 前置きをスキップするときは「Optionモジュールの未掲載関数」からお読みください。

F#はMicrosoftのDon Syme氏が開発したプログラミング言語で、命令型、オブジェクト指向、関数型の要素を併せ持つマルチパラダイム言語と位置付けられています。実装はオープンソースのMITライセンスのもと、githubのリポジトリで公開されています。

実行環境は.NET Frameworkおよび.NET CoreやMonoといったマルチプラットフォームに対応していますが、サポート状況については各プラットフォームごとの情報を参照してください(「F# の概要」など)。

Optionについて

Optionは、検索など結果を得られないかもしれないときの戻り値としてよく利用される型です。結果が存在するときはSome result(resultが結果)、存在しないときはNoneという値で表します。型名は'T option('Tresultの型名)で表されます。

Some resultからresultを得るには、match-withで処理の振り分けを行います。これにより、値がSome resultのときとNoneのとき、それぞれの処理を設定できます。たとえばList.tryFind関数で得られた結果を表示するには、以下のようにできます。

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 'Ttype 'T option = Option<'T>ですが、これ以外にメンバー関数も実装されています(詳細)。メンバー関数には、通常のメンバー関数とstaticなメンバー関数があります。

Optionのメンバー関数
let opt = Some 1

opt.IsSome  // true
opt.IsNone  // false
opt.Value   // 1
Optionのstaticメンバー関数
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の値が引数と一致するかを確かめ、truefalseのどちらかを判定します。Option値がNoneであれば必ずfalseです。

Option.contains
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
Option.defaultValue -1 (Some 3)  // 3
Option.defaultValue -1 (None)    // -1

Option.defaultWith デフォルト関数 Option値
(unit -> 'a) -> 'a option -> 'a

Option.defaultValueと似ていますが、引数のOption値がNoneのときはデフォルト関数を実行します。この関数に引数はありません。また、関数の戻り値の型はSome aaの型と同一にしてください。

Option.defaultWith
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のとき、abの値を引数とする関数を実行します。この結果にSomeがつけられ、map2関数の結果となります。どちらかのOption値がNoneのときは結果も必ずNoneとなります。

Option.map2
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 aOption値bがSome bOption値cがSome cのとき、abcの値を引数とする関数を実行します。この結果にSomeがつけられ、map3関数の結果となります。どれかのOption値がNoneのときは結果も必ずNoneとなります。

Option.map3
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
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
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に変換されます。

Option.ofNullable
open System
Option.ofNullable (Nullable 1)       // Some 1
Option.ofNullable (Nullable<int>())  // Option<int>.None (int option型のNone)

ドキュメントが更新されたら、このページは不要になると思いますが、その時までご覧になった方々の参考になればと思います。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3