回答編集履歴
1
段落の切り方や接続詞を修正
answer
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
一言で言うと、`a`は「関数の戻り値」です。
|
2
2
|
|
3
3
|
`((->) r)`は`(+ 3)`のように、関数型を表す演算子`->`の左辺(第1型引数)に`r`という型変数を適用したものを表しています。
|
4
|
-
|
5
4
|
`->`の左辺は関数の引数の型を表していて、もう一つの引数である右辺は関数の戻り値の型を表しているのでした。
|
6
5
|
なので、例えば`((->) r a)`という型は`r -> a`と等価で、「`r`を受け取って`a`を返す関数」を表していますし、`((->) Int Bool)`という型は`Int -> Bool`と等価で「`Int`を受け取って`Bool`を返す関数」を表しています。
|
7
6
|
|
8
|
-
|
7
|
+
従って、`((->) r)`は「`->`に対して、引数の型`r`のみを適用した型」であり、それを`Monad`や`Functor`における`m`や`f`として扱うと、`m a`は`((->) r a)`、すなわち「`r`を受け取って`a`を返す関数」と置き換えられることになります。
|
9
8
|
つまり`a`はやっぱり「戻り値の型」なんですね。
|
10
9
|
|
11
10
|
やや長くなったので一旦割愛しますが、`h >>= f = \w -> f (h w) w`という`(>>=)`の実装における各式の型を詳細に見ても、関数モナドにおける`m a`の`a`が関数の戻り値となっていることがわかるはずです。
|