From 1eaeaa88d8a54f8e0599e56ccd2a6caf603b03f7 Mon Sep 17 00:00:00 2001 From: s-taiga Date: Mon, 24 Jun 2024 23:07:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E9=96=8B=E5=A7=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functional-programming-lean/src/functor-applicative-monad.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/functional-programming-lean/src/functor-applicative-monad.md b/functional-programming-lean/src/functor-applicative-monad.md index 059dec6f..00d66560 100644 --- a/functional-programming-lean/src/functor-applicative-monad.md +++ b/functional-programming-lean/src/functor-applicative-monad.md @@ -1,4 +1,6 @@ -# Functors, Applicative Functors, and Monads + + +# 関手とアプリカティブ関手、そしてモナド `Functor` and `Monad` both describe operations for types that are still waiting for a type argument. One way to understand them is that `Functor` describes containers in which the contained data can be transformed, and `Monad` describes an encoding of programs with side effects. From d4d0da6bc2b2c57f3ddb2ca075469e234f8ab365 Mon Sep 17 00:00:00 2001 From: s-taiga Date: Mon, 24 Jun 2024 23:34:03 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=E7=BF=BB=E8=A8=B3=E5=AE=8C=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/functor-applicative-monad.md | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/functional-programming-lean/src/functor-applicative-monad.md b/functional-programming-lean/src/functor-applicative-monad.md index 00d66560..971a5eee 100644 --- a/functional-programming-lean/src/functor-applicative-monad.md +++ b/functional-programming-lean/src/functor-applicative-monad.md @@ -1,21 +1,25 @@ -# 関手とアプリカティブ関手、そしてモナド +# 関手とアプリカティブ関手,そしてモナド -`Functor` and `Monad` both describe operations for types that are still waiting for a type argument. + -From the perspective of data structures, `Option` is a bit like a nullable type or like a list that can contain at most one entry. +`Functor` と `Monad` はどちらもさらに型引数を待ち受ける型の演算を記述します.このことを理解するにあたって,`Functor` は変換対象のデータを保持するコンテナを記述し,`Monad` は副作用のあるプログラムのエンコードを記述するものと考えるのも1つの手でしょう.しかし,この理解は不完全です.というのも, `Option` は `Functor` と `Monad` の両方のインスタンスを持ち,オプショナルな値と値の返却に失敗するかもしれない計算を **同時に** 表現するからです. + + + +データ構造の観点から,`Option` はnullable型や高々1個の要素しか保持できないリストのようなものに少し似ています.制御構造の観点からは,`Option` は結果を伴わずに早期リターンするかもしれない計算を表現します.通常,`Functor` インスタンスを使うプログラムは `Option` の使い道をデータ構造としてみなす場合が最も簡単であり,一方で `Monad` インスタンスを使うプログラムも `Option` の使い道を早期の失敗を許可するものとみなす場合が最も簡単ですが,これらの観点両方を流暢に使えるようになることは関数型プログラミングの達人になるためには重要なポイントです. -There is a deeper relationship between functors and monads. + +関手とモナドの間には深い関係があります.実は **すべてのモナドは関手になります** .言い換えると,すべての関手がモナドにはならないため,モナドの抽象化は関手の抽象化よりも強力であるということです.さらに,両者の間には **アプリカティブ関手** (applicative functor)と呼ばれる抽象化が存在します.これもまた多くの興味深いプログラムを書くにあたって十分な力を持ち,`Monad` のインタフェースを使えないライブラリでも使うことができます.型クラス `Applicative` はアプリカティブ関手のオーバーロードされた演算を提供します.すべてのモナドはアプリカティブ関手であり,またすべてのアプリカティブ関手は関手ですが,これらの逆は成り立ちません. From 1eb3a747b7a13f26f960bc51a2be350024b7a087 Mon Sep 17 00:00:00 2001 From: s-taiga Date: Fri, 19 Jul 2024 01:00:47 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=A2=E3=82=A6=E3=83=88=E4=BD=8D=E7=BD=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/functor-applicative-monad.md | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/functional-programming-lean/src/functor-applicative-monad.md b/functional-programming-lean/src/functor-applicative-monad.md index 971a5eee..60e8d858 100644 --- a/functional-programming-lean/src/functor-applicative-monad.md +++ b/functional-programming-lean/src/functor-applicative-monad.md @@ -1,25 +1,33 @@ - + # 関手とアプリカティブ関手,そしてモナド - +After all, `Option` has instances for both `Functor` and `Monad`, and simultaneously represents an optional value _and_ a computation that might fail to return a value. +--> `Functor` と `Monad` はどちらもさらに型引数を待ち受ける型の演算を記述します.このことを理解するにあたって,`Functor` は変換対象のデータを保持するコンテナを記述し,`Monad` は副作用のあるプログラムのエンコードを記述するものと考えるのも1つの手でしょう.しかし,この理解は不完全です.というのも, `Option` は `Functor` と `Monad` の両方のインスタンスを持ち,オプショナルな値と値の返却に失敗するかもしれない計算を **同時に** 表現するからです. - +Typically, programs that use the `Functor` instance are easiest to think of as using `Option` as a data structure, while programs that use the `Monad` instance are easiest to think of as using `Option` to allow early failure, but learning to use both of these perspectives fluently is an important part of becoming proficient at functional programming. +--> データ構造の観点から,`Option` はnullable型や高々1個の要素しか保持できないリストのようなものに少し似ています.制御構造の観点からは,`Option` は結果を伴わずに早期リターンするかもしれない計算を表現します.通常,`Functor` インスタンスを使うプログラムは `Option` の使い道をデータ構造としてみなす場合が最も簡単であり,一方で `Monad` インスタンスを使うプログラムも `Option` の使い道を早期の失敗を許可するものとみなす場合が最も簡単ですが,これらの観点両方を流暢に使えるようになることは関数型プログラミングの達人になるためには重要なポイントです. - +Every monad is an applicative functor, and every applicative functor is a functor, but the converses do not hold. +--> 関手とモナドの間には深い関係があります.実は **すべてのモナドは関手になります** .言い換えると,すべての関手がモナドにはならないため,モナドの抽象化は関手の抽象化よりも強力であるということです.さらに,両者の間には **アプリカティブ関手** (applicative functor)と呼ばれる抽象化が存在します.これもまた多くの興味深いプログラムを書くにあたって十分な力を持ち,`Monad` のインタフェースを使えないライブラリでも使うことができます.型クラス `Applicative` はアプリカティブ関手のオーバーロードされた演算を提供します.すべてのモナドはアプリカティブ関手であり,またすべてのアプリカティブ関手は関手ですが,これらの逆は成り立ちません. From 579aefdc4a75c2125b4f17355e0086a587fbe1cb Mon Sep 17 00:00:00 2001 From: s-taiga Date: Sat, 24 Aug 2024 18:10:51 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E3=82=BB=E3=83=AB=E3=83=95=E3=83=AC?= =?UTF-8?q?=E3=83=93=E3=83=A5=E3=83=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functional-programming-lean/src/SUMMARY.md | 2 +- .../src/functor-applicative-monad.md | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/functional-programming-lean/src/SUMMARY.md b/functional-programming-lean/src/SUMMARY.md index f4da2678..e92fe349 100644 --- a/functional-programming-lean/src/SUMMARY.md +++ b/functional-programming-lean/src/SUMMARY.md @@ -37,7 +37,7 @@ - [`IO` モナド](./monads/io.md) - [その他の便利な機能](monads/conveniences.md) - [まとめ](monads/summary.md) -- [Functors, Applicative Functors, and Monads](functor-applicative-monad.md) +- [関手・アプリカティブ関手・モナド](functor-applicative-monad.md) - [Structures and Inheritance](functor-applicative-monad/inheritance.md) - [Applicative Functors](functor-applicative-monad/applicative.md) - [The Applicative Contract](functor-applicative-monad/applicative-contract.md) diff --git a/functional-programming-lean/src/functor-applicative-monad.md b/functional-programming-lean/src/functor-applicative-monad.md index 60e8d858..3fafcfea 100644 --- a/functional-programming-lean/src/functor-applicative-monad.md +++ b/functional-programming-lean/src/functor-applicative-monad.md @@ -2,7 +2,7 @@ # Functors, Applicative Functors, and Monads --> -# 関手とアプリカティブ関手,そしてモナド +# 関手・アプリカティブ関手・モナド -`Functor` と `Monad` はどちらもさらに型引数を待ち受ける型の演算を記述します.このことを理解するにあたって,`Functor` は変換対象のデータを保持するコンテナを記述し,`Monad` は副作用のあるプログラムのエンコードを記述するものと考えるのも1つの手でしょう.しかし,この理解は不完全です.というのも, `Option` は `Functor` と `Monad` の両方のインスタンスを持ち,オプショナルな値と値の返却に失敗するかもしれない計算を **同時に** 表現するからです. +`Functor` と `Monad` はどちらもさらに型引数を待ち受ける型の演算を記述します。このことを理解するにあたって、`Functor` は変換対象のデータを保持するコンテナを記述し、`Monad` は副作用のあるプログラムのエンコードを記述するものと考えるのも1つの手でしょう。しかし、この理解は不完全です。というのも、 `Option` は `Functor` と `Monad` の両方のインスタンスを持ち、オプショナルな値と値の返却に失敗するかもしれない計算を **同時に** 表現するからです。 -データ構造の観点から,`Option` はnullable型や高々1個の要素しか保持できないリストのようなものに少し似ています.制御構造の観点からは,`Option` は結果を伴わずに早期リターンするかもしれない計算を表現します.通常,`Functor` インスタンスを使うプログラムは `Option` の使い道をデータ構造としてみなす場合が最も簡単であり,一方で `Monad` インスタンスを使うプログラムも `Option` の使い道を早期の失敗を許可するものとみなす場合が最も簡単ですが,これらの観点両方を流暢に使えるようになることは関数型プログラミングの達人になるためには重要なポイントです. +データ構造の観点から、`Option` はnullable型や高々1個の要素しか保持できないリストのようなものに少し似ています。制御構造の観点からは、`Option` は結果を伴わずに早期リターンするかもしれない計算を表現します。通常、`Functor` インスタンスを使うプログラムは `Option` の使い道をデータ構造としてみなす場合が最も簡単であり、一方で `Monad` インスタンスを使うプログラムも `Option` の使い道を早期の失敗を許可するものとみなす場合が最も簡単ですが、これらの観点両方を流暢に使えるようになることは関数型プログラミングの達人になるためには重要なポイントです。 -関手とモナドの間には深い関係があります.実は **すべてのモナドは関手になります** .言い換えると,すべての関手がモナドにはならないため,モナドの抽象化は関手の抽象化よりも強力であるということです.さらに,両者の間には **アプリカティブ関手** (applicative functor)と呼ばれる抽象化が存在します.これもまた多くの興味深いプログラムを書くにあたって十分な力を持ち,`Monad` のインタフェースを使えないライブラリでも使うことができます.型クラス `Applicative` はアプリカティブ関手のオーバーロードされた演算を提供します.すべてのモナドはアプリカティブ関手であり,またすべてのアプリカティブ関手は関手ですが,これらの逆は成り立ちません. +関手とモナドの間には深い関係があります。実は **すべてのモナドは関手になります** 。言い換えると、すべての関手がモナドにはならないため、モナドの抽象化は関手の抽象化よりも強力であるということです。さらに、両者の間には **アプリカティブ関手** (applicative functor)と呼ばれる抽象化が存在します。これもまた多くの興味深いプログラムを書くにあたって十分な力を持ち、`Monad` のインタフェースを使えないライブラリでも使うことができます。型クラス `Applicative` はアプリカティブ関手のオーバーロードされた演算を提供します。すべてのモナドはアプリカティブ関手であり、またすべてのアプリカティブ関手は関手ですが、これらの逆は成り立ちません。