[ 戻る ]


# Java読書会BOF「Kotlinによる関数型プログラミング入門 関数型ソフトウェア設計の理論と実践」を読む会 第1回

## 開催概要

| 項目   | 内容                                              |
|--------|---------------------------------------------------|
| 日時   | 2026年10月24日 10:00 - 17:00                      |
| 場所   | てくのかわさき 第2研修室                          |
| 出席者 | 高橋 (徹)、高橋 (智)、遠藤、吉本、井上、加藤 (記) |

本日は本の最初から。イントロダクションと第1章の間に付録Aと付録Bを読み、付録Cは別の機会 (最終回?) に回す。

---

## 表紙

- 原書のタイトルは?
    - "From Objects to Functions - Build Your Software Faster and Safer with Functional Programming and Kotlin"
- Kotlin の読み方
    - p451 によると **コットリン**

## 訳者について

- p433 バイスサワーって何だろう?
    - 大田区の飲料メーカーが作っている、居酒屋などで飲まれている炭酸飲料とのこと

## 翻訳者まえがき

- p16 第5段落2行目、「あえて技術書の邦訳を行うということ。母国語でアクセスしやすい知識を...」とあるが、句点と読点を誤植しているように見える
    - 翻訳作業に生成 AI のサポートを借りたとあるが、この部分を書いたのは生成 AI なのか人間なのかちょっと気になる

## 序文

- p17 「品質だけでは十分なベロシティは得られませんが、スピードを得ることはできます。スピードをベロシティに変えるには、方向性も必要です。」とあるが、スピードとベロシティの違いが難しい
    - velocity (速度) と speed (速さ) は似た単語だが、velocity は向きを持つ
    - もっと直観的な言い換えはないだろうか?

## イントロダクション: なぜ関数型プログラミングなのか

### なぜ Kotlin なのか

- p23 「ジョーの疑問」のジョーって誰?
    - 特定の誰かではなくメタ的に使われる名前かもしれない
    - 次のページにある Joe Armstrong (Erlang 言語の開発者) ・・・ではなさそう

### 関数型プログラミングの本質

### オブジェクト指向プログラミングを忘れる

#### 主体と操作ではなく、データ変換に着目する

#### メソッドを持たないオブジェクトを作る

- p25 ドメインモデル貧血症って?
    - データだけ持っているクラスで、オブジェクト指向のデータと操作を一体とするカプセル化に逆行している
    - DDD 界隈ではアンチパターンとして有名

#### 不要なインタフェースを避ける

#### 複雑なジェネリック型を恐れない

### まとめ

## 付録A 関数型プログラミングとは何か?

- 過去の読書会の関数型プログラミングの本について
    - 2014年に「Java 8 Lambdas: Pragmatic Functional Programming」を、2016年に「Javaによる関数型プログラミング」を読んでいる

### A.1 起源

### A.2 参照透過性を実現する

#### A.2.1 関数を純粋に保つ

#### A.2.2 可変の型を信頼しない

- p369 `assertEquals()` を2回実行するテストコード、 `BowingGameMutabule` だと失敗するのは2回目のほう?
    - `roll()` を 5 -> 4 -> 4 と実行しており、4を2回呼び出すことで振る舞いが変わるはず
      - -> _宿題!_
    - この比較はインスタンス比較か、それとも `equals()` を呼んで比較してくれるのか?
        - Kotlin の data class が提供する `equals()` を呼んでくれるのでは

#### A.2.3 考え得るすべての入力に対処する

- p371 例外を使わず、無効な入力を単に無視するのは不安がある
    - システムのすべてを関数型で実現するのは現実的ではなく、特定のライブラリの中でのみ関数型を実践するなど限定した状況を作ってあげる必要があるのでは

### A.3 射で考える

#### A.3.1 関数をデータとして扱う

- p.374 「すべての純粋関数は不変の関数でもある」とあるが、結局純粋と不変の違いは?
    - 純粋性とは、結果を返さないといけない (かつ、戻り値の計算以外の作用を持たない) ことと、その結果が入力のみに依存しなければならないこと
    - 不変性とは、ある入力に対して常に同じ出力を返すこと

#### A.3.2 型を厳密に定義する

#### A.3.3 宣言的なスタイルを選ぶ

#### A.3.4 怠惰であることを心がける

- p378 遅延操作という言葉が出てきたが、新しい言葉か?
    - 遅延評価される関数のことを便宜的にそう呼んでいるだけかもしれない
- p379 遅延とメモ化の違い
    - メモ化は計算結果のキャッシュみたいなもの、かつて読んだ「Javaによる関数型プログラミング」でも紹介されていた

### A.4 まとめ

## 付録B 関数型 Kotlin

- 過去の読書会の Kotlin に関する本について
  - 2018年に「Kotlinイン・アクション」を読んでいる
- p381 Ceylon (セイロン) は RedHat が開発していた JVM 言語、ほとんど流行らないまま開発終了した

### B.1 Kotlin をセットアップする

#### B.1.1 Gradle

- p383 訳注にもあるように今は Kotlin で Gradle DSL を書くのが主流
    - build.gradle.kts というファイル名になる
    - ビルドスクリプトには動的型付け言語 (Groovy) のほうが向いている原著者の主張もよくわかるが、Kotlin の書式で関数など書けるのは嬉しい

#### B.1.2 Hello World

#### B.1.3 自動変換

### B.2 Kotlin 入門

#### B.2.1 一時変数

#### B.2.2 関数

#### B.2.3 関数の型

- p386 Java の Integer と Kotlin の Int が混ざっていてちょっと混乱するコード

#### B.2.4 Unit

#### B.2.5 Nothing

#### B.2.6 ラムダ変数

#### B.2.7 拡張関数

#### B.2.8 新しい関数を返す

#### B.2.9 スコープ関数

- p390 スマートだが乱用すると可読性が悪化する諸刃の剣
- p390 `apply` を使うと Boolean ではなく user を返却してしまうのでは?Boolean を返すなら `run` のような
    - -> _宿題!_

#### B.2.10 クラス

- p391 name は下の名前で surname が苗字、イギリス式
- p391 open をたくさん付けないと継承できないよう設計することで継承を使いづらくし、継承の乱用を防いでいるとも考えられる

#### B.2.11 オブジェクトとコンパニオンオブジェクト

#### B.2.12 データクラス

- p392 Kotlin の data class は Java の record にマッピングされる?
    - 現状は普通の class になる模様、また可変の場合はそもそも不可能

#### B.2.13 委譲による実装

#### B.2.14 委譲プロパティ

- p393 42ってなに?
    - 銀河ヒッチハイク・ガイドで登場する有名な数字
- `superLongComputation()` の結果が 42 ってこと?
    - 42 は単なる戻り値、`superLongComputation()` は `sleep()` みたいなものだと思えばよい

#### B.2.15 型エイリアス

#### B.2.16 internal という可視性

- p394 デフォルトの可視性が public というのは Java プログラマーには受け入れがたく感じる
    - private を大量に書くのが冗長、またデフォルト package-private だと関数の再利用を妨げやすいなどの問題があるのではないか

#### B.2.17 when

- p394 今の Java の switch でもこれみたいなことができる
    - data class → record と同じく、Kotlin が先で Java が後から追従したもの

#### B.2.18 シールドクラス

#### B.2.19 シールドインタフェース

#### B.2.20 キーワード tailrec

#### B.2.21 シーケンス

- p397 Java にも無限ストリームがあったような
    - Stream API の `Stream.iterate()` や `Stream.generate()` を使う

### B.3 Kotlin 型システムの探求

#### B.3.1 null 許容型

#### B.3.2 中置関数

- p399 中置関数ってどこで使う?
  - 書籍にあるような DSL ぐらいしかユースケースを思いつかない

#### B.3.3 演算子

- p399 Kotlin の標準ライブラリだと Java の `BigDecimal` に四則演算子が使えるようになっているなど細かいところに演算子オーバーロードが活用されている

---

次回は p27 の第1章冒頭から


[ 戻る ]