Skip to content

Commit

Permalink
Fill the introduction of \"section of operators\"
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Jan 14, 2024
1 parent 245e2c5 commit 63b8762
Showing 1 changed file with 34 additions and 25 deletions.
59 changes: 34 additions & 25 deletions assets/18.md
Original file line number Diff line number Diff line change
Expand Up @@ -542,62 +542,71 @@ ghci> double 10
20
```

足し算`+`やかけ算`*`の演算子ではこれで十分なのですが、引き算`-`などのように左辺と右辺を逆にすると計算結果が変わる演算子では不都合な場合があります:
足し算`+`やかけ算`*`の演算子ではこれで十分なのですが、割り算`/`などのように左辺と右辺を逆にすると計算結果が変わる演算子では不都合な場合があります:

```haskell
--1000 引く関数」を作るつもりが...
ghci> minus1000 = (-) 1000
-- 出来上がったのは、「1000 *から*引数に渡した値を引く関数
ghci> minus1000 100
900
--1000で割る関数」を作るつもりが...
ghci> dividesBy = (/) 1000
-- 出来上がったのは、「1000 *を*引数に渡した値で割る関数
ghci> dividesBy 100
10.0
```

もちろん、次のように引数の順番を入れ替えた関数を作れば、期待した関数が出来上がります:

```haskell
ghci> minus1000 l = l - 1000
ghci> minus1000 100
-900
ghci> dividesBy l = l / 1000
ghci> dividesBy 100
0.1
```

実はこれをもっと簡単に作れるようにするのが、ここで紹介する「演算子のセクション」という機能です。

先頭に`"Hello, "`をくっつける関数
実はこれをもっと簡単に作れるようにするのが、ここで紹介する「演算子のセクション」という機能です。例えば、問題の「1000 で割る関数」は「演算子のセクション」を使えば次のように書くことができます:

```haskell
ghci> dividesBy = (/ 1000)
ghci> dividesBy 100
0.1
```
ghci> :t (++)
(++) :: [a] -> [a] -> [a]

ghci> :t ("Hello, " ++)
("Hello, " ++) :: [Char] -> [Char]
先ほどの`dividesBy`と同じように振る舞ってますね!

ghci> map ("Hello, " ++) ["Tom", "Bob", "Alice"]
["Hello, Tom","Hello, Bob","Hello, Alice"]
「演算子のセクション」は、次のように演算子とそのどちらかの引数をまとめてカッコで囲うことで作ることができます:

```haskell
(/ 1000)
```

さっきの「演算子を前置関数に変換する」で紹介した
これは、割り算の演算子`/`の右辺に`1000`を渡して作った関数です。左辺の値は引数として渡されるので、先ほど示したとおり「`1000`で割る関数」が出来上がります。

もちろん、左辺に引数を渡して右辺に演算子を渡すこともできます:

```haskell
(1000 /)
```

これは逆に渡した数で`1000`を割る関数ですね。

「演算子のセクション」を活用すれば「演算子を前置関数に変換する」で紹介したこちら↓の例も...

```haskell
ghci> map ((+) 4) [1, 2, 3]
[5,6,7]
```

も、
次のように、より少ないカッコで書き換えることができます:

```
```haskell
ghci> map (+ 4) [1, 2, 3]
[5,6,7]
```

と書いていいし、足し算は右辺と左辺を入れ替えても結果が変わらないので、
足し算は右辺と左辺を入れ替えても結果が変わらないので、次のように書いてもOKです:

```
```haskell
ghci> map (4 +) [1, 2, 3]
[5,6,7]
```

と書いてもよい!

#### 演算子のセクションは、マイナスだけは使いにくい

```
Expand Down

0 comments on commit 63b8762

Please sign in to comment.