Option型

プログラミング言語特に関数型プログラミング言語において。}}と型理論において、Option型またはMaybe型は存在しない可能性のある値をカプセル化して表すパラメトリック多相である。例えば、関数の戻り値が存在する場合と存在しない場合を表すためにこの型は使用される。この型は空多くの場合、NoneまたはNothingという名前。}}またはオリジナルのデータ型Aをカプセルした多くの場合、Just AまたはSome Aと書かれる。}}コンストラクタから構成されている。

関数型プログラミング以外において、全く異なるが関連する概念としてNullable型多くの場合、A?として表される。}}がオブジェクト指向プログラミングで一般的である。Option型とNullable型の主な違いは、Option型はネストすることができる例えば、Maybe  ≠ Maybe String。}}のに対して、Nullable型はこれに対応していない例えば、String?? =}} String?。}}ことである。

1. 理論的側面
--------

型理論において、Option型はのように記述することができる。これは与えられた値の組に対して、Option型はの有効な値の組に正確に1つの追加の値を追加するという事実を表している。これはタグ付き共用体を持つ言語において、Option型がカプセル化型とUnit型のタグ付き共用体として表現できるという事実によってプログラミングに反映されている。

カリー＝ハワード同型対応において、Option型は∨: x∨1=1の消滅法則に関連しているdate=August 2019。

Option型は1個または0個の要素を含むill。

Option型もモナドであり、次のようになる:

return = Just -- Wraps the value into a maybe

Nothing >>= f = Nothing -- Fails if the previous monad fails  >>= f = f x -- Succeeds when both monads succeed<WtXmlEndTag />

Option型のモナディックな性質は、失敗とエラーを効率的に追跡するのに役立つ。

2. 型名と定義
--------

それぞれのプログラミング言語において、Option型は様々な名前と定義がある。

Agdaでは、2=agdaと2=agdaという要素を持ち、2=agdaという名前で定義されている。
Coqでは、2=coqとして定義されている。
Elmでは、Maybeという名前で2=elmとして定義されている。
Haskellでは、Maybeという名前で2=haskellとして定義されている。
Idrisでは、2=idrisとして定義されている。
OCamlでは、2=ocamlとして定義されている。
Pythonでは、3.10以降で2=pythonまたは2=python[[wiktionary:type hintingとして示される。
Rustでは、2=rustとして定義されている。
Scalaでは、2=scalaと2=scalaの型拡張によって、2=scalaとして定義されている。
Standard MLでは、2=smlとして定義されている。
Swiftでは、2=swiftとして定義されているが、通常は2=swiftとして記述される。

3. 例
----

3.1. F#
-------

コード例:let compute = Option.fold  "No value"

let full = Some 42 let empty = None

compute full |> printfn "compute full -> %s" compute empty |> printfn "compute empty -> %s"<WtXmlEndTag />

実行結果:compute full -> The value is: 42 compute empty -> No value<WtXmlEndTag />

3.2. Haskell
------------

コード例:compute :: Maybe Int -> String compute = foldl  "No value"

main :: IO  main = do let full = Just 42 let empty = Nothing

putStrLn $ "compute full -> " ++ compute full putStrLn $ "compute empty -> " ++ compute empty<WtXmlEndTag />

実行結果:compute full -> The value is: 42 compute empty -> No value<WtXmlEndTag />

3.3. Nim
--------

コード例:import std/options

proc compute: string = opt.map: string = "The value is: " & $x).get

let full = some empty = none

echo "compute -> ", compute echo "compute -> ", compute<WtXmlEndTag />

実行結果:compute -> The Value is: 42 compute -> No value<WtXmlEndTag />

3.4. OCaml
----------

OCamlはOptionをパラメータ化された要素型として実装している。Optionは次のように構築及び分解される:

コード例:let compute = Option.fold ~none:"No value" ~some:

let  = let full = Some 42 in let empty = None in

print_endline ; print_endline <WtXmlEndTag />

実行結果:compute full -> The value is: 42 compute empty -> No value<WtXmlEndTag />

3.5. Rust
---------

コード例:fn compute -> String { opt.map_or, |x| format!) }

fn main { let full = Some; let empty = None;

println! -> {}", compute); println! -> {}", compute); }<WtXmlEndTag />

実行結果:compute -> The value is: 42 compute -> No value<WtXmlEndTag />

3.6. Scala
----------

ScalaはOptionをパラメータ化された型として実装しているので、変数はOptionになることができ、次のようにアクセスできる:

コード例:object Main { def compute: String = opt.fold

def main: Unit = { val full = Some val empty = None

println -> ${compute}") println -> ${compute}") } }<WtXmlEndTag />

実行結果:compute -> The value is: 42 compute -> No value<WtXmlEndTag />

Optionの値を使用する方法は2つある。1つは、最良ではないが最初の例のようにパターンマッチングによる方法である。もう1つは、最良の方法である2番目の例のようなモナディックアプローチである。このように、プログラムは例外またはエラーを生成することができない例えばNoneと等しいOption変数の値を取得しようとすることによって。}}ので安全である。従って、これは基本的にnull値の型安全な代替手段として機能する。

3.7. Swift
----------

コード例:func compute -> String { return opt.map { "The value is: \" } ?? "No value" }

let full = 42 let empty: Int? = nil

print -> \)") print -> \)")<WtXmlEndTag />

実行結果:compute -> The value is: 42 compute -> No value<WtXmlEndTag />

3.8. Zig
--------

コード例:const std = @import; const print = std.io.getStdOut.writer.print;

const Compute = struct n;

pub fn main !void { const full = Compute.init; const empty = Compute.init;

try print; try print; }<WtXmlEndTag />

実行結果:full -> The value is: 42 empty -> No value<WtXmlEndTag />

Zigでは、?i32 の様に型名の前に ? を追加するとOptional型となる。if  |n| { の様に if 文、あるいは while文でペイロード n をキャプチャーすることができ、null の場合 else 節が評価される。

4. 脚注
-----

4.1. 注釈
-------

4.2. 出典
-------

5. 関連項目
-------

Nullable型
例外処理
パターンマッチング