Grokking Functional Programming¶
「Grokking Functional Programming」(Michal Plachta 著)の学習用リポジトリです。 Scala、Java、F#、C#、Haskell、Clojure、Elixir、Rust、Python、TypeScript、Ruby の11言語で関数型プログラミングの実装例と日本語解説を提供します。
11言語統合比較¶
全 11 言語を横断的に比較する統合記事シリーズです。各章ごとに言語間の共通点と相違点を分析しています。
| Part | 章 | タイトル | 統合記事 |
|---|---|---|---|
| I | 01 | 関数型プログラミング入門 | 11言語比較 |
| I | 02 | 純粋関数と副作用 | 11言語比較 |
| II | 03 | イミュータブルなデータ操作 | 11言語比較 |
| II | 04 | 高階関数 | 11言語比較 |
| II | 05 | flatMap とモナド的合成 | 11言語比較 |
| III | 06 | Option 型 | 11言語比較 |
| III | 07 | Either 型と ADT | 11言語比較 |
| IV | 08 | IO モナドと副作用の分離 | 11言語比較 |
| IV | 09 | ストリーム処理 | 11言語比較 |
| V | 10 | 並行・並列処理 | 11言語比較 |
| VI | 11 | 実践アプリケーション | 11言語比較 |
| VI | 12 | テスト戦略 | 11言語比較 |
言語別解説¶
Scala 版¶
Scala 3 と cats-effect/fs2 を使った関数型プログラミングの実装例です。
Java 版¶
Java 21 と Vavr を使った関数型プログラミングの実装例です。
F# 版¶
F# 8 と .NET を使った関数型プログラミングの実装例です。
C# 版¶
C# 12 と LanguageExt を使った関数型プログラミングの実装例です。
Haskell 版¶
Haskell(GHC 9.x)を使った純粋関数型プログラミングの実装例です。
Clojure 版¶
Clojure 1.11 と core.async を使った関数型プログラミングの実装例です。
Elixir 版¶
Elixir 1.15 と OTP を使った関数型プログラミングの実装例です。
Rust 版¶
Rust と tokio を使った関数型プログラミングの実装例です。
Python 版¶
Python 3.11+ と returns ライブラリを使った関数型プログラミングの実装例です。
TypeScript 版¶
TypeScript 5.x と fp-ts を使った関数型プログラミングの実装例です。
Ruby 版¶
Ruby 3.x と dry-rb を使った関数型プログラミングの実装例です。
章構成¶
| Part | 内容 | Scala | Java | F# | C# | Haskell | Clojure | Elixir | Rust | Python | TypeScript | Ruby |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| I | 関数型プログラミングの基礎 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 | part-1 |
| II | 関数型スタイルのプログラミング | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 | part-2 |
| III | エラーハンドリング | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 | part-3 |
| IV | IO と副作用の管理 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 | part-4 |
| V | 並行処理 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 | part-5 |
| VI | 実践的なアプリケーション | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 | part-6 |
主要トピック¶
| Part | 主要トピック | Scala | Java | F# | C# | Haskell | Clojure | Elixir | Rust | Python | TypeScript | Ruby |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| I | 純粋関数、参照透過性 | 関数型基礎 | 関数型インターフェース | let バインディング | 式形式メソッド | 純粋関数、遅延評価 | defn, let | def, fn | fn, 所有権 | def, 型ヒント | pipe, 関数合成 | def, ブロック |
| II | イミュータブル、高階関数、flatMap | List, Option | Vavr List, Option | List, パイプライン | Seq, LINQ | リスト内包表記, fold | map/filter/reduce | Enum, パイプ | Iterator, クロージャ | map/filter, ジェネレータ | ReadonlyArray, chain | Enumerable, flat_map |
| III | Option、Either、ADT | sealed trait | sealed interface | 判別共用体 | Option, Either | Maybe, Either, ADT | nil, some->/some->> | {:ok}/{:error} | Option, Result | Maybe, Result (returns) | Option, Either, fold | nil安全, Result型 |
| IV | IO モナド、Stream | cats-effect, fs2 | 独自 IO, Vavr Stream | Async, Seq | Task, IAsyncEnumerable | IO モナド, conduit | lazy-seq | Agent, Stream | async/await, Stream | IO, ジェネレータ | Task, TaskEither, IO | IO, Enumerator |
| V | Ref、Fiber、並列処理 | cats-effect Ref/Fiber | 独自 Ref, Virtual Thread | Ref, MailboxProcessor | Ref, Task並列 | STM, TVar, async | atom/ref, core.async | Task, GenServer | Arc, Mutex, tokio | asyncio, FutureResult | sequenceT, traverseArray | Ref, Thread |
| VI | Resource、テスト | ScalaCheck | JUnit 5 プロパティテスト | use, FsCheck | Resource, Validator | bracket, QuickCheck | with-open, test.check | ExUnit, StreamData | トレイト, proptest | Protocol, Hypothesis | Reader, fast-check | Resource, RSpec |
参照¶
- Grokking Functional Programming - 原著
- Scala 公式ドキュメント
- cats-effect
- fs2
- Vavr
- F# 公式ドキュメント
- F# for Fun and Profit
- LanguageExt
- Haskell 公式サイト
- Learn You a Haskell
- Clojure 公式サイト
- ClojureDocs
- Elixir 公式ドキュメント
- Elixir School
- Rust 公式ドキュメント
- tokio
- Python 公式ドキュメント
- returns
- Hypothesis
- TypeScript 公式ドキュメント
- fp-ts
- fast-check
- Ruby 公式ドキュメント
- dry-rb
- RSpec