Skip to content

Commit 8866e08

Browse files
committed
Complete explanation of >>
1 parent 42ad6c5 commit 8866e08

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

assets/19.md

+17-20
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ map @Bool @Integer (\x -> if x then 1 else 0)
189189
:: [Bool] -> [Integer]
190190
```
191191

192-
このように`TypeApplications`を使うことで`map`関数が受け取る型変数に手動で具体的な型を代入することができるようになります
192+
このように`TypeApplications`を使うと`map`関数が受け取る型変数に手動で具体的な型を代入することができるようになります
193193

194194
今回は`Monad`のことを考えないために`(>>)`の`m`を`TypeApplications`で`IO`に置き換えてみるのに使いましょう
195195

@@ -198,46 +198,43 @@ ghci> :t (>>) @IO
198198
(>>) @IO :: IO a -> IO b -> IO b
199199
```
200200

201-
2つの引数と戻り値:
201+
`(>>)`の元々の型は`Monad m => m a -> m b -> m b`でしたが、`TypeApplications``m``IO`に置き換えることで、`IO a -> IO b -> IO b`という型になりました。すごくシンプルで分かりやすくなりましたね!
202202

203-
- 第1引数(左辺)の`IO a`: `getLine``putStrLn "hello"`などの命令。
204-
- 第2引数(右辺)の`IO b`: 同じく`getLine``putStrLn "hello"`などの命令。
205-
- 戻り値の`IO b`: 第2引数(右辺)の命令と、同じ型の値を返す命令。
203+
遠回りになってしまいましたが、いよいよ`IO`専用の`>>`について、型を読み解いてみましょう。引数と戻り値は次のような型となっています:
206204

207-
「右辺の命令の結果をそのまま返す命令」を返すことが読み取れる。
208-
例えば
205+
- 第1引数(左辺)の`IO a`: `getLine``putStrLn "hello"`などの命令
206+
- 第2引数(右辺)の`IO b`: 同じく`getLine``putStrLn "hello"`などの命令
207+
- 戻り値の`IO b`: 第2引数(右辺)の命令と、同じ型の値を返す命令
209208

210-
```
211-
ask =
212-
putStrLn "Hello, how are you?"
213-
>> getLine
209+
「右辺の命令の結果をそのまま返す命令」を返すことが読み取れますね。実際に動かしてみるともっとよく分かるでしょう。例えば、
210+
211+
```haskell
212+
putStrLn "Hello, how are you?" >> getLine
214213
```
215214

216-
と書くと、`putStrLn "Hello, how are you?"``getLine`を続けて実行して、`getLine`の実行結果を返す命令が作られる
215+
と書くと、`putStrLn "Hello, how are you?"``getLine`を続けて実行して、`getLine`の実行結果を返す命令が作られます
217216

218-
```
219-
ghci> ask
217+
```haskell
218+
ghci> putStrLn "Hello, how are you?" >> getLine
220219
Hello, how are you?
221220
Fine! -- ここはユーザーによる入力
222221
"Fine!"
223222
```
224223

225-
`do`を使ってやってもやっぱり同じ。
224+
`do`を使って`putStrLn``getLine`を続けて書いた場合も、やはり同じように動作します:
226225

227-
```
226+
```haskell
228227
ghci> :{
229-
ghci| ask = do
228+
ghci| do
230229
ghci| putStrLn "Hello, how are you?"
231230
ghci| getLine
232231
ghci| :}
233-
ghci> ask
234232
Hello, how are you?
235233
Alright. -- ここはユーザーによる入力
236234
"Alright."
237235
```
238236

239-
まとめると、`>>`は、「両辺の命令を続けて実行して、右辺の命令の結果を返す命令」を作る演算子。
240-
ほかのプログラミング言語でよく出てくるセミコロン `;`とよく似てる。
237+
まとめると、`>>`は、「両辺の命令を続けて実行して、右辺の命令の結果を返す命令」を作る演算子となっています。
241238

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

0 commit comments

Comments
 (0)