Commit 2664951 1 parent 8866e08 commit 2664951 Copy full SHA for 2664951
File tree 1 file changed +20
-9
lines changed
1 file changed +20
-9
lines changed Original file line number Diff line number Diff line change @@ -238,35 +238,46 @@ Alright. -- ここはユーザーによる入力
238
238
239
239
### ` do ` 記法の正体2: ` <- ` をなくす ` >>= `
240
240
241
- 今度は` do ` の中で単に命令を列挙する処理だけでなく、 ` do ` の中で ` <- ` を使って変数に代入をする処理を 、` do ` を使わないで書き換えてみましょう。
241
+ 今度は` do ` の中で単に命令を列挙するだけでなく、 ` <- ` を使った変数への代入も 、` do ` を使わないで書き換えてみましょう。
242
242
243
- ```
243
+ 例として、次のように` getLine ` 取得した文字列を` line ` という変数に代入し、そのまま` putStrLn ` に渡す命令を書き換えます:
244
+
245
+ ``` haskell
244
246
echo = do
245
247
line <- getLine
246
248
putStrLn line
247
249
```
248
250
249
- ↓のように置き換えられる!
251
+ このように書かれた ` echo ` は、次↓のように置き換えることができます:
250
252
251
- ```
253
+ ``` haskell
252
254
echo = getLine >>= putStrLn
253
255
```
254
256
255
- 1行だけ。またしても` do ` がない!
256
- ` >>= ` とは何者?
257
+ ` line ` という変数右細い矢印` <- ` は消え、代わりに` >>= ` という演算子で` getLine ` と` putStrLn ` を繋げるようになりました。もちろん` do ` もありません。
257
258
258
- ```
259
+ さて、` >>= ` とは何者なんでしょう?前節の` >> ` と同様に` >>= ` も演算子なので、いつもの` :t ` コマンドで、どのような型かが分かります:
260
+
261
+ ``` haskell
259
262
ghci> : t (>>=)
260
263
(>>=) :: Monad m => m a -> (a -> m b ) -> m b
261
264
```
262
265
263
- また ` Monad ` が出てきたので、 ` TypeApplications ` で ` IO ` に置き換えてみる。
266
+ またしても `Monad `が出てきました 。 ` Monad `の話は後回しにしたいので 、 ` >> `の時と同様に 、 ` TypeApplications `で型変数 `m` を` IO `に置き換えておきましょう :
264
267
265
- ```
268
+ ```haskell
266
269
ghci> : t (>>=) @ IO
267
270
(>>=) @ IO :: IO a -> (a -> IO b ) -> IO b
268
271
```
269
272
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
+
270
281
` >> ` と違って第二引数が関数` a -> IO b ` になっているのがポイント。
271
282
272
283
2つの引数と戻り値:
You can’t perform that action at this time.
0 commit comments