@@ -189,7 +189,7 @@ map @Bool @Integer (\x -> if x then 1 else 0)
189
189
:: [Bool ] -> [Integer ]
190
190
```
191
191
192
- このように、 `TypeApplications `を使うことで 、 `map` 関数が受け取る型変数に手動で具体的な型を代入することができるようになります。
192
+ このように、 `TypeApplications `を使うと `map` 関数が受け取る型変数に手動で具体的な型を代入することができるようになります。
193
193
194
194
今回は、 `Monad `のことを考えないために`(>>) `の`m` を`TypeApplications `で`IO `に置き換えてみるのに使いましょう。
195
195
@@ -198,46 +198,43 @@ ghci> :t (>>) @IO
198
198
(>>) @ IO :: IO a -> IO b -> IO b
199
199
```
200
200
201
- 2つの引数と戻り値:
201
+ ` (>>) ` の元々の型は ` Monad m => m a -> m b -> m b ` でしたが、 ` TypeApplications ` で ` m ` を ` IO ` に置き換えることで、 ` IO a -> IO b -> IO b ` という型になりました。すごくシンプルで分かりやすくなりましたね!
202
202
203
- - 第1引数(左辺)の` IO a ` : ` getLine ` や` putStrLn "hello" ` などの命令。
204
- - 第2引数(右辺)の` IO b ` : 同じく` getLine ` や` putStrLn "hello" ` などの命令。
205
- - 戻り値の` IO b ` : 第2引数(右辺)の命令と、同じ型の値を返す命令。
203
+ 遠回りになってしまいましたが、いよいよ` IO ` 専用の` >> ` について、型を読み解いてみましょう。引数と戻り値は次のような型となっています:
206
204
207
- 「右辺の命令の結果をそのまま返す命令」を返すことが読み取れる。
208
- 例えば
205
+ - 第1引数(左辺)の` IO a ` : ` getLine ` や` putStrLn "hello" ` などの命令
206
+ - 第2引数(右辺)の` IO b ` : 同じく` getLine ` や` putStrLn "hello" ` などの命令
207
+ - 戻り値の` IO b ` : 第2引数(右辺)の命令と、同じ型の値を返す命令
209
208
210
- ```
211
- ask =
212
- putStrLn "Hello, how are you?"
213
- >> getLine
209
+ 「右辺の命令の結果をそのまま返す命令」を返すことが読み取れますね。実際に動かしてみるともっとよく分かるでしょう。例えば、
210
+
211
+ ``` haskell
212
+ putStrLn " Hello, how are you? " >> getLine
214
213
```
215
214
216
- と書くと、` putStrLn "Hello, how are you?" ` と` getLine ` を続けて実行して、` getLine ` の実行結果を返す命令が作られる 。
215
+ と書くと、` putStrLn "Hello, how are you?" ` と` getLine ` を続けて実行して、` getLine ` の実行結果を返す命令が作られます 。
217
216
218
- ```
219
- ghci> ask
217
+ ``` haskell
218
+ ghci> putStrLn " Hello, how are you? " >> getLine
220
219
Hello , how are you?
221
220
Fine ! -- ここはユーザーによる入力
222
221
" Fine!"
223
222
```
224
223
225
- ` do ` を使ってやってもやっぱり同じ。
224
+ ` do ` を使って ` putStrLn ` と ` getLine ` を続けて書いた場合も、やはり同じように動作します:
226
225
227
- ```
226
+ ``` haskell
228
227
ghci> : {
229
- ghci| ask = do
228
+ ghci| do
230
229
ghci| putStrLn " Hello, how are you?"
231
230
ghci| getLine
232
231
ghci| : }
233
- ghci> ask
234
232
Hello , how are you?
235
233
Alright . -- ここはユーザーによる入力
236
234
" Alright."
237
235
```
238
236
239
- まとめると、` >> ` は、「両辺の命令を続けて実行して、右辺の命令の結果を返す命令」を作る演算子。
240
- ほかのプログラミング言語でよく出てくるセミコロン ` ; ` とよく似てる。
237
+ まとめると、` >> ` は、「両辺の命令を続けて実行して、右辺の命令の結果を返す命令」を作る演算子となっています。
241
238
242
239
### ` do ` 記法の正体2: ` <- ` をなくす ` >>= `
243
240
0 commit comments