Skip to content

Commit 9d21979

Browse files
committed
Explain the both operands and return type of >>=
1 parent 2664951 commit 9d21979

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

assets/19.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ Alright. -- ここはユーザーによる入力
238238

239239
### `do`記法の正体2: `<-`をなくす `>>=`
240240

241-
今度は`do`の中で単に命令を列挙するだけでなく`<-`を使った変数への代入も、`do`を使わないで書き換えてみましょう。
241+
今度は`do`の中における単純な命令の列挙だけでなく`<-`を使った変数への代入も、`do`を使わないで書き換えてみましょう。
242242

243243
例として、次のように`getLine`取得した文字列を`line`という変数に代入し、そのまま`putStrLn`に渡す命令を書き換えます:
244244

@@ -254,7 +254,7 @@ echo = do
254254
echo = getLine >>= putStrLn
255255
```
256256

257-
`line`という変数右細い矢印`<-`は消え、代わりに`>>=`という演算子で`getLine``putStrLn`を繋げるようになりました。もちろん`do`もありません。
257+
`line`という変数と右細い矢印`<-`は消え、代わりに`>>=`という演算子で`getLine``putStrLn`を繋げるようになりました。もちろん`do`もありません。
258258

259259
さて、`>>=`とは何者なんでしょう?前節の`>>`と同様に`>>=`も演算子なので、いつもの`:t`コマンドで、どのような型かが分かります:
260260

@@ -263,7 +263,7 @@ ghci> :t (>>=)
263263
(>>=) :: Monad m => m a -> (a -> m b) -> m b
264264
```
265265

266-
またしても`Monad`が出てきました`Monad`の話は後回しにしたいので`>>`の時と同様に`TypeApplications`で型変数`m`を`IO`に置き換えておきましょう:
266+
またしても`Monad`が出てきました`Monad`の話は後回しにしたいので`>>`の時と同様に`TypeApplications`で型変数`m`を`IO`に置き換えておきましょう:
267267

268268
```haskell
269269
ghci> :t (>>=) @IO
@@ -278,17 +278,17 @@ ghci> :t (>>=) @IO
278278
-- 比較しやすさのために、記号の位置を適当に揃えています
279279
```
280280

281-
`>>`と違って第二引数が関数`a -> IO b`になっているのがポイント。
281+
`>>`と異なり、第二引数(右辺)の型が関数`a -> IO b`になっている点がポイントです。2つの引数と戻り値の型はそれぞれ次の通りです:
282282

283-
2つの引数と戻り値:
283+
- 第1引数(左辺)の`IO a`: 第二引数の関数`a -> IO b`の、**引数**と同じ型`a`の値を返す`IO`(命令)。
284+
- 第2引数(右辺)の`a -> IO b`: 何か(`IO`でない、普通の)値`a`を受け取って、命令`IO b`を返す。
285+
- 戻り値の`IO b`: 第二引数の関数`a -> IO b`の、**結果**と同じ型`b`の値を返す`IO`(命令)。
284286

285-
- `IO a`: 第二引数の関数`a -> IO b`の、**引数**と同じ型`a`の値を返す`IO`(命令)。
286-
- `a -> IO b`: 何か(`IO`でない、普通の)値`a`を受け取って、命令`IO b`を返す。
287-
- `IO b`: 第二引数の関数`a -> IO b`の、**結果**と同じ型`b`の値を返す`IO`(命令)。
287+
まとめると`>>=`は、「左辺の命令の実行結果を受け取って、右辺の『命令を返す関数』につなげて、続けて実行する命令」を返す演算子と言えます。
288288

289-
「左辺の命令の実行結果を受け取って、右辺の『命令を返す関数』につなげて、続けて実行する命令」を返す演算子
289+
先程の例、`echo`関数における`>>=`の左辺・右辺・戻り値の型がそれぞれどう当てはめられているか見てみましょう。`echo`関数は次のように`getLine``putStrLn`関数を`>>=`に渡していました:
290290

291-
```
291+
```haskell
292292
echo = getLine >>= putStrLn
293293
```
294294

0 commit comments

Comments
 (0)