Skip to content

Commit

Permalink
Complete ex19
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Oct 13, 2024
1 parent 1eae3d9 commit 2e4fc61
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions assets/19.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ ghci> :t map @Bool @Integer
map @Bool @Integer :: (Bool -> Integer) -> [Bool] -> [Integer]
```

通常、この、型変数に具体的な型を代入する処理は型推論によってコンパイル時に自動で行われますが`TypeApplications`を有効にすると、ユーザーが自ら制御できるようになるのです。
通常、この、型変数に具体的な型を代入する処理は型推論によって自動で行われますが`TypeApplications`を有効にすると、ユーザーが自ら制御できるようになるのです。

`TypeApplications`で作られた`map @Bool @Integer`は、`Bool`型のリストを受け取って、その各要素に`Bool -> Integer`関数を適用し、`Integer`型のリストを返す、専用の関数となっています。そのため、通常の`map`関数と異なり必ず`Bool -> Integer`型の関数を渡さなければなりません:

Expand Down Expand Up @@ -206,7 +206,7 @@ ghci> :t (>>) @IO
- 第2引数(右辺)の`IO b`: 同じく`getLine``putStrLn "hello"`などの命令
- 戻り値の`IO b`: 第2引数(右辺)の命令と、同じ型の値を返す命令

右辺の命令の結果をそのまま返す命令」を返すことが読み取れますね。実際に動かしてみるともっとよく分かるでしょう。例えば、
第2引数(右辺)の命令の結果をそのまま返す命令」を返すことが読み取れるでしょうか?実際に動かしてみるともっとよく分かるでしょう。例えば、

```haskell
putStrLn "Hello, how are you?" >> getLine
Expand Down Expand Up @@ -281,7 +281,7 @@ ghci> :t (>>=) @IO
`>>`と異なり、第二引数(右辺)の型が関数`a -> IO b`になっている点がポイントです。2つの引数と戻り値の型はそれぞれ次の通りです:

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

まとめると`>>=`は、「左辺の命令の実行結果を受け取って、右辺の『命令を返す関数』につなげて、続けて実行する命令」を返す演算子と言えます。
Expand Down Expand Up @@ -357,9 +357,18 @@ do

ちなみに、先程の`getLine >>= return . length`という例では`return`を使って`length`関数の結果を`IO`に変換しましたが、`return`を使わない、もっと簡潔で気軽な方法もあります。詳しくは次の課題で!

### 番外編: 各種演算子の読み方(発音)

今回説明した演算子`>>``>>=`は、次のように発音します:

- `>>`: then
- `>>=`: bind

他の演算子については<https://wiki.haskell.org/Pronunciation>をご覧ください。

### 番外編: 他によく使われる`do`を消すために使う関数

この課題を解くのに必要な知識は以上ですが、既存のHaskellで書かれたコードでよく使われている、`>>=`によく似た関数を一つ紹介しておきましょう`=<<`です:
この課題を解くのに必要な知識は以上ですが、既存のHaskellで書かれたコードでよく使われている、`>>=`とよく似た関数を一つ紹介しておきましょう`=<<`です:

```haskell
ghci> :t (=<<)
Expand All @@ -386,12 +395,3 @@ echo = putStrLn =<< getLine
といった具合に`=<<`を使って書き換えることができます。

筆者は個人的には`>>=`より`=<<`の方をよく使います。`関数(引数)`という、ありふれた関数呼び出しの構文と同じ順番で書けるからです。

### 番外編: 各種演算子の読み方(発音)

今回説明した演算子`>>``>>=`は、次のように発音します:

- `>>`: then
- `>>=`: bind

他の演算子については<https://wiki.haskell.org/Pronunciation>をご覧ください。

0 comments on commit 2e4fc61

Please sign in to comment.