Haskell はすける
簡単に言うとこんな感じ!
Haskellは「数学の世界をそのままプログラムにしてしまった言語」だよ!「変数の値は絶対に変わらない」「同じ入力には必ず同じ出力」というルールを徹底することで、バグが起きにくい超厳密なコードが書けるんだ!
Haskellとは
Haskellは、1990年に誕生した純粋関数型プログラミング言語です。「関数型」とは、プログラムを「入力を受け取って出力を返す関数の組み合わせ」として書くスタイルのこと。中でもHaskellは「純粋」と呼ばれるほど、この原則を徹底しています。変数の値を書き換えたり、ファイルに書き込むといった「副作用」を、通常のコードから厳密に分離して扱います。
静的型付けと型推論を組み合わせた強力な型システムも大きな特徴です。コンパイル時(プログラムを実行する前)に型の整合性を徹底チェックするため、「実行してみたらエラーが出た」という事態を防ぎやすくなっています。また、遅延評価という仕組みにより、「実際に値が必要になるまで計算しない」という動きをするため、無限リストのような独特の記述もできます。
Haskellはビジネスの現場で直接使われることは少ないですが、他の多くの言語(Scala、Rust、TypeScriptなど)に多大な影響を与えており、「プログラミングの考え方をレベルアップさせる言語」として研究・教育の世界で高く評価されています。
Haskellの核心的な概念・構造
| 概念 | 意味 | 身近なたとえ |
|---|---|---|
| 純粋関数 | 同じ入力には常に同じ出力を返す関数 | 自動販売機(同じボタン→同じ商品) |
| 不変性(イミュータビリティ) | 一度決めた変数の値は変えられない | 数学の「x = 3」は途中で変わらない |
| 型推論 | 型を書かなくてもコンパイラが自動判断 | 「3」と書けば整数だとわかる |
| 遅延評価 | 必要になるまで計算を後回しにする | 注文が来てから料理を作る |
| モナド | 副作用を安全に扱うための構造 | 「副作用専用の通路」を設ける仕組み |
| 型クラス | 型に共通の振る舞いを定義する仕組み | Javaのインターフェースに近い概念 |
覚え方:Haskellの「純粋」とは?
「同じ材料・同じレシピ → 必ず同じ料理」
これがHaskellの純粋性。料理の途中で材料を勝手に変えたり、隠し味を足したりできない(副作用の排除)というイメージで覚えよう!
Haskellの主な特徴まとめ
┌──────────────────────────────────────┐
│ Haskellの3大特徴 │
│ │
│ ① 純粋関数型 ─ 副作用を完全分離 │
│ ② 強い型システム ─ 型推論+静的型付け│
│ ③ 遅延評価 ─ 必要な時だけ計算 │
└──────────────────────────────────────┘
歴史と背景
- 1987年 — 関数型言語が乱立していたため、研究者が「統一的な標準言語を作ろう」とプロジェクト開始
- 1990年 — Haskell 1.0 リリース。論理学者のHaskell Curryの名前が由来
- 1998年 — Haskell 98として標準化。教育・研究用途に普及
- 2010年 — Haskell 2010として改訂。現在も広く使われるベースに
- 2000年代〜 — GHC(Glasgow Haskell Compiler)が事実上の標準コンパイラとして定着
- 2010年代〜 — ScalaやRust、Swift、Kotlinなどが型推論や関数型の概念を取り込み、Haskellの影響が主流言語に波及
- 現在 — 金融系システム(Standard Chartered銀行など)や、高信頼性が求められるシステムで実用利用
他のプログラミング言語との比較
Haskellと他の言語の違いを「副作用の扱い」と「型システム」で比較すると理解しやすいです。
| 言語 | パラダイム | 副作用の扱い | 型付け | 評価戦略 |
|---|---|---|---|---|
| Haskell | 純粋関数型 | モナドで完全分離 | 静的・強い(型推論あり) | 遅延評価 |
| Python | マルチパラダイム | 自由(制限なし) | 動的・強い | 正格評価 |
| Java | オブジェクト指向 | 自由(制限なし) | 静的・強い | 正格評価 |
| Scala | 関数型+OOP | 推奨で分離 | 静的・強い(型推論あり) | 正格評価(遅延も可) |
| Rust | システム+関数型 | 所有権で管理 | 静的・強い(型推論あり) | 正格評価 |
| Erlang | 関数型 | プロセス分離 | 動的 | 正格評価 |
Haskellと関数型言語の系譜
Haskellのコード例(雰囲気をつかむ)
-- フィボナッチ数列(無限リスト)
fibs :: [Integer]
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
-- 最初の10個だけ取り出す
first10 = take 10 fibs
-- → [0,1,1,2,3,5,8,13,21,34]
コードが数学の定義に非常に近い形で書けるのがHaskellの特徴です。「fibsはfibsを使って定義する」という再帰的な表現も自然に記述できます。
関連用語
- ./070-functional-programming.md — 関数型プログラミング — プログラムを「関数の組み合わせ」として構築するパラダイム
- ./071-static-typing.md — 静的型付け — 実行前にデータの型を確定させるコンパイル時チェックの仕組み
- ./072-type-inference.md — 型推論 — コンパイラが変数の型を自動判断してくれる仕組み
- ./073-scala.md — Scala — HaskellのエッセンスをJVM上に持ち込んだ関数型+OOP言語
- ./075-rust.md — Rust — 型安全と高パフォーマンスを両立したシステムプログラミング言語
- ./076-monad.md — モナド — 副作用を安全にラップするHaskellの中心的構造
- ./077-lazy-evaluation.md — 遅延評価 — 値が必要になるまで計算を先延ばしにする評価戦略
- ./078-pure-function.md — 純粋関数 — 副作用を持たず、同じ入力に常に同じ出力を返す関数