🔰モナド入門:プログラミング言語を横断する共通の特徴から学ぶ2024/12/24に公開3件HaskellScala関数型プログラミングPureScriptモナドtechDiscussioncola2025/01/14に更新記事を書いて下さりありがとうございます。 モナドが理解出来ていないので質問させてください。 記事にあるように bをMaybe String とした場合 bindのところの画像の真ん中は String -> Maybe Maybe String となってしまうのではないかと思ってしまうのですがなぜ入れ子になってしまわないのかが理解できていません。 もし回答頂けましたら嬉しいです。 返信を追加funnycat2025/01/16colaさん 記事を読んでいただきまして、ありがとうございます。 ご質問いただいた内容について、回答いたします。 冗長になってしまうことをご容赦いただきたいのですが、質問いただいた節について、あらためて説明してみます。 まず『bindを使うと何が嬉しいか』の節では次のような前提で話を進めています。 m a の a の型を変換したい (この例ではMaybe StringのStringをIntに変換したい) 変換の際、mという文脈は保ちたい (この例ではMaybeの文脈を保ちたい) そしてこういった変換が行えそうな関数としてmapやbindがあることを紹介しています。 mapではa -> bという型の関数を受け取る bindではa -> m bという型の関数を受け取る この前提のもと、それぞれの変換の関数で、Maybe Intを返したらどうなるかを考えています。 ここについて上記の前提を踏まえつつ、aやbなどを少しずつ置換しながら今一度説明してみます。 まずmapはm a -> (a -> b) -> m bという型の関数です(引数の順序は入れ替えてますが)。 まずmをMaybeで置き換えます。 Maybe a -> (a -> b) -> Maybe b 次にaをStringに置き換えます。 Maybe String -> (String -> b) -> Maybe b 変換の関数ではMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。 Maybe String -> (String -> Maybe Int) -> Maybe (Maybe Int) 同じことをbindについても行ってみます。 bindはm a -> (a -> m b) -> m bという型の関数です。 まずmをMaybeで置き換えます。 Maybe a -> (a -> Maybe b) -> Maybe b 次にaをStringに置き換えます。 Maybe String -> (String -> Maybe b) -> Maybe b 変換の関数ではMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。 Maybe String -> (String -> Maybe Int) -> Maybe Int さて、ここであらためて質問を読み返しながら回答を書いてみます。 記事にあるように bをMaybe String とした場合 ここについては、前提として変換の関数で返したいのはMaybe Intなのですが、 bindの場合、変換の関数で返す型はm bなので、bそのものをMaybe Intに置き換えずとも、m bを返すことになっているので、やりたいことが素直に実現できます。 ですので なぜ入れ子になってしまわないのか については、やりたいことを実現するにあたって、入れ子にする必要がない、というのが回答になります。 以上、あらためて説明してみましたが、ご質問に対してお答えできていたら幸いです。 返信を追加たけぴょん2025/03/09何度もHaskellのモナド(とApplicative)に挫折していましたが、この記事の文脈という表現が自分の中でイメージがマッチして理解が深まったような気がします。とても助かりました。 少々記事内容から飛んでしまうのですが質問させてください。 圏論の文脈ではモナドはCを圏として関手T:C \rightarrow Cと2つの自然変換\eta : 1_C \rightarrow Tと\mu : T^2 \rightarrow T .... と定義されています(Wikipediaの定義を引用)が、Haskellでのreturnが自然変換\eta : 1_C \rightarrow T、>>=が自然変換\mu : T^2 \rightarrow Tに対応するのでしょうか? お手隙あればご回答いただけると助かります。 返信を追加
cola2025/01/14に更新記事を書いて下さりありがとうございます。 モナドが理解出来ていないので質問させてください。 記事にあるように bをMaybe String とした場合 bindのところの画像の真ん中は String -> Maybe Maybe String となってしまうのではないかと思ってしまうのですがなぜ入れ子になってしまわないのかが理解できていません。 もし回答頂けましたら嬉しいです。 返信を追加
funnycat2025/01/16colaさん 記事を読んでいただきまして、ありがとうございます。 ご質問いただいた内容について、回答いたします。 冗長になってしまうことをご容赦いただきたいのですが、質問いただいた節について、あらためて説明してみます。 まず『bindを使うと何が嬉しいか』の節では次のような前提で話を進めています。 m a の a の型を変換したい (この例ではMaybe StringのStringをIntに変換したい) 変換の際、mという文脈は保ちたい (この例ではMaybeの文脈を保ちたい) そしてこういった変換が行えそうな関数としてmapやbindがあることを紹介しています。 mapではa -> bという型の関数を受け取る bindではa -> m bという型の関数を受け取る この前提のもと、それぞれの変換の関数で、Maybe Intを返したらどうなるかを考えています。 ここについて上記の前提を踏まえつつ、aやbなどを少しずつ置換しながら今一度説明してみます。 まずmapはm a -> (a -> b) -> m bという型の関数です(引数の順序は入れ替えてますが)。 まずmをMaybeで置き換えます。 Maybe a -> (a -> b) -> Maybe b 次にaをStringに置き換えます。 Maybe String -> (String -> b) -> Maybe b 変換の関数ではMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。 Maybe String -> (String -> Maybe Int) -> Maybe (Maybe Int) 同じことをbindについても行ってみます。 bindはm a -> (a -> m b) -> m bという型の関数です。 まずmをMaybeで置き換えます。 Maybe a -> (a -> Maybe b) -> Maybe b 次にaをStringに置き換えます。 Maybe String -> (String -> Maybe b) -> Maybe b 変換の関数ではMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。 Maybe String -> (String -> Maybe Int) -> Maybe Int さて、ここであらためて質問を読み返しながら回答を書いてみます。 記事にあるように bをMaybe String とした場合 ここについては、前提として変換の関数で返したいのはMaybe Intなのですが、 bindの場合、変換の関数で返す型はm bなので、bそのものをMaybe Intに置き換えずとも、m bを返すことになっているので、やりたいことが素直に実現できます。 ですので なぜ入れ子になってしまわないのか については、やりたいことを実現するにあたって、入れ子にする必要がない、というのが回答になります。 以上、あらためて説明してみましたが、ご質問に対してお答えできていたら幸いです。 返信を追加
たけぴょん2025/03/09何度もHaskellのモナド(とApplicative)に挫折していましたが、この記事の文脈という表現が自分の中でイメージがマッチして理解が深まったような気がします。とても助かりました。 少々記事内容から飛んでしまうのですが質問させてください。 圏論の文脈ではモナドはCを圏として関手T:C \rightarrow Cと2つの自然変換\eta : 1_C \rightarrow Tと\mu : T^2 \rightarrow T .... と定義されています(Wikipediaの定義を引用)が、Haskellでのreturnが自然変換\eta : 1_C \rightarrow T、>>=が自然変換\mu : T^2 \rightarrow Tに対応するのでしょうか? お手隙あればご回答いただけると助かります。 返信を追加
Discussion
記事を書いて下さりありがとうございます。
モナドが理解出来ていないので質問させてください。
記事にあるように

bをMaybe String
とした場合
bindのところの画像の真ん中は
String -> Maybe Maybe String
となってしまうのではないかと思ってしまうのですがなぜ入れ子になってしまわないのかが理解できていません。
もし回答頂けましたら嬉しいです。
colaさん
記事を読んでいただきまして、ありがとうございます。
ご質問いただいた内容について、回答いたします。
冗長になってしまうことをご容赦いただきたいのですが、質問いただいた節について、あらためて説明してみます。
まず『bindを使うと何が嬉しいか』の節では次のような前提で話を進めています。
(この例では
Maybe StringのStringをIntに変換したい)mという文脈は保ちたい(この例では
Maybeの文脈を保ちたい)そしてこういった変換が行えそうな関数として
mapやbindがあることを紹介しています。mapではa -> bという型の関数を受け取るbindではa -> m bという型の関数を受け取るこの前提のもと、それぞれの変換の関数で、
Maybe Intを返したらどうなるかを考えています。ここについて上記の前提を踏まえつつ、
aやbなどを少しずつ置換しながら今一度説明してみます。まず
mapはm a -> (a -> b) -> m bという型の関数です(引数の順序は入れ替えてますが)。mをMaybeで置き換えます。Maybe a -> (a -> b) -> Maybe baをStringに置き換えます。Maybe String -> (String -> b) -> Maybe bMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。Maybe String -> (String -> Maybe Int) -> Maybe (Maybe Int)同じことを
bindについても行ってみます。bindはm a -> (a -> m b) -> m bという型の関数です。mをMaybeで置き換えます。Maybe a -> (a -> Maybe b) -> Maybe baをStringに置き換えます。Maybe String -> (String -> Maybe b) -> Maybe bMaybe Intを返したいという前提があるので、最後にbをMaybe Intに置き換えます。Maybe String -> (String -> Maybe Int) -> Maybe Intさて、ここであらためて質問を読み返しながら回答を書いてみます。
ここについては、前提として変換の関数で返したいのは
Maybe Intなのですが、bindの場合、変換の関数で返す型はm bなので、bそのものをMaybe Intに置き換えずとも、m bを返すことになっているので、やりたいことが素直に実現できます。ですので
については、やりたいことを実現するにあたって、入れ子にする必要がない、というのが回答になります。
以上、あらためて説明してみましたが、ご質問に対してお答えできていたら幸いです。
何度もHaskellのモナド(とApplicative)に挫折していましたが、この記事の文脈という表現が自分の中でイメージがマッチして理解が深まったような気がします。とても助かりました。
少々記事内容から飛んでしまうのですが質問させてください。C を圏として関手T:C \rightarrow C と2つの自然変換\eta : 1_C \rightarrow T と\mu : T^2 \rightarrow T .... と定義されています(Wikipediaの定義を引用)が、Haskellでのreturnが自然変換\eta : 1_C \rightarrow T 、>>=が自然変換\mu : T^2 \rightarrow T に対応するのでしょうか?
圏論の文脈ではモナドは
お手隙あればご回答いただけると助かります。