0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Enumによる有限性の構造化:モナドの入り口

Posted at

"世界を切り分けるには、まず“起こりうること”を限定せよ。"

Rustにおける enum は、ただの列挙子ではない。
それは構造としての有限性の設計手段であり、抽象と制約を同時に表現する道具だ。

多くの言語で enum は「列挙子の定数」で終わる。
しかしRustでは、enum型そのものであり、状態と構造の分岐を“安全に”定義するための中核である。
さらに言えば、関数型パラダイムにおける“モナド”的構造への入口でもある。

この章では、Rustの enum が設計に与える力と、その背後にある構造的哲学を掘り下げていく。


Enumとは、分岐の設計構造である

Rustにおける enum の定義はこうだ:

enum Status {
    Ok,
    Error,
}

この構造は、C言語などの単純な列挙子定義とよく似ている。
だが、Rustの enumバリアントにデータを持たせることができる

enum Status {
    Ok(String),
    Error(u32),
}

これは、「状態」と「文脈の違い」を型レベルで表現できる強力な抽象手段である。
分岐ごとに文脈を定義できる構文とも言える。


matchによって設計者は「すべての可能性」と向き合う

Rustでは、enum を扱うには match を使うのが一般的だ。

fn respond(status: Status) {
    match status {
        Status::Ok(message) => println!("Success: {}", message),
        Status::Error(code) => println!("Error code: {}", code),
    }
}

この match は、あらゆる分岐を網羅しなければコンパイルが通らない
つまり、「起こりうるすべての事象」に対して、設計者は明示的に対処する責任を負う。

“全てのケースを設計せよ。設計しないものは、存在を許さない。”


OptionとResult:モナドの顔をしたEnum

Rustの Option<T>Result<T, E> は、ただの列挙型ではない。
これらは、関数型言語におけるMaybe型・Either型の再解釈であり、
安全なエラー処理・分岐処理の設計構造そのものである。

enum Option<T> {
    Some(T),
    None,
}

enum Result<T, E> {
    Ok(T),
    Err(E),
}

これらは、型と構文によって「何が起こりうるか」を記述し、制御構造を生み出す仕組みである。
そして、これこそがモナド的思考の起点である。


抽象と制約を同時に提供するEnumの強さ

普通、型は柔軟性を上げるほど制約が減る。
だがRustの enum はその逆を行く。柔軟性と制約が共存している。

  • enum によって表現可能な構造は自由度が高い
  • match によってすべての分岐を網羅する義務が課される

これにより、「意図的な制限によって信頼できる抽象」が生まれる
これは、安全と汎用性の両立という、設計者が求め続けた理想の1つの答えである。


Enumは振る舞いの抽象にも拡張できる

Rustでは enum にメソッドを定義できる。

impl Status {
    fn is_ok(&self) -> bool {
        matches!(self, Status::Ok(_))
    }
}

これは、「状態を定義するだけでなく、状態に対する振る舞いも閉じ込めることができる」という意味になる。

つまり、enum はデータ構造でありながら、モジュール的責任も負える構造体なのである。


「if」ではなく「match」へ:分岐の意味を問う

Rustでは、 match を使うことで条件分岐を「設計」へと昇華できる

  • if: 状態を前提にして処理を分ける(不完全でも書ける)
  • match: 状態そのものを列挙し、すべてを扱う(不完全なら書けない)

この違いは、「プログラミングの自由」ではなく、**「設計の誠実さ」**である。


Enum × map / and_then:モナド的振る舞いの獲得

OptionResult は、.map().and_then() によって連鎖的に操作が可能になる。

fn double(x: Option<i32>) -> Option<i32> {
    x.map(|n| n * 2)
}

この構文は、関数型プログラミングにおけるモナドの bind に対応し、
“文脈付きの値”を、安全かつ構造的に処理する連続性を表現している。

“文脈を持つ値を、文脈の中で安全に変形する”

それは、ただの計算ではない。「構造の流れ」による設計の再構築である。


結語:Enumとは有限性に秩序を与える型である

Rustの enum は、可読性や構文糖衣のためにあるのではない。
それは、有限性という制約に美しさと信頼性を与えるための言語設計である。

そしてその先には、関数型言語に根差した**“構造の文脈化”という思想=モナド的世界**がある。

"起こりうることをすべて定義する。それが、混沌に秩序を与える設計の第一歩である。"

0
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
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?