Skip to content

Commit 2664951

Browse files
committed
Begin to explain >>=
1 parent 8866e08 commit 2664951

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

assets/19.md

+20-9
Original file line numberDiff line numberDiff line change
@@ -238,35 +238,46 @@ Alright. -- ここはユーザーによる入力
238238

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

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

243-
```
243+
例として、次のように`getLine`取得した文字列を`line`という変数に代入し、そのまま`putStrLn`に渡す命令を書き換えます:
244+
245+
```haskell
244246
echo = do
245247
line <- getLine
246248
putStrLn line
247249
```
248250

249-
↓のように置き換えられる!
251+
このように書かれた`echo`は、次↓のように置き換えることができます:
250252

251-
```
253+
```haskell
252254
echo = getLine >>= putStrLn
253255
```
254256

255-
1行だけ。またしても`do`がない!
256-
`>>=`とは何者?
257+
`line`という変数右細い矢印`<-`は消え、代わりに`>>=`という演算子で`getLine``putStrLn`を繋げるようになりました。もちろん`do`もありません。
257258

258-
```
259+
さて、`>>=`とは何者なんでしょう?前節の`>>`と同様に`>>=`も演算子なので、いつもの`:t`コマンドで、どのような型かが分かります:
260+
261+
```haskell
259262
ghci> :t (>>=)
260263
(>>=) :: Monad m => m a -> (a -> m b) -> m b
261264
```
262265

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

265-
```
268+
```haskell
266269
ghci> :t (>>=) @IO
267270
(>>=) @IO :: IO a -> (a -> IO b) -> IO b
268271
```
269272

273+
まだちょっと複雑に見えるでしょうか?先程の`>>`の型(型変数`m``IO`に置き換えたバージョン)と並べるとはっきりしてくるはずです:
274+
275+
```haskell
276+
(>>=) @IO :: IO a -> (a -> IO b) -> IO b
277+
(>>) @IO :: IO a -> IO b -> IO b
278+
-- 比較しやすさのために、記号の位置を適当に揃えています
279+
```
280+
270281
`>>`と違って第二引数が関数`a -> IO b`になっているのがポイント。
271282

272283
2つの引数と戻り値:

0 commit comments

Comments
 (0)