Skip to content

Commit

Permalink
Explain (part of) the problem of the unary minus operator
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Jan 21, 2024
1 parent 63b8762 commit 70a64b2
Showing 1 changed file with 26 additions and 8 deletions.
34 changes: 26 additions & 8 deletions assets/18.md
Original file line number Diff line number Diff line change
Expand Up @@ -609,28 +609,46 @@ ghci> map (4 +) [1, 2, 3]

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

ただし、演算子のセクションは、引き算の演算子`-`に対して利用する場合、意図通りに動かない場合があります。例えば`(- 4)`と入力して、`(- 4)`という、`-`をカッコで囲った「`-`演算子のセクション」を作ってみます:

```haskell
ghci> (- 4)
-4
```

GHCiは`-4`と出力しました。どうやら`(- 4)`は、演算子のセクションでできるであろう「4引く関数」ではなく、単なる数値の`-4`として解釈されてしまうようです。`:t`コマンドで型を調べてみると、そのことがもっとはっきり分かります:

```haskell
ghci> :t (- 4)
(- 4) :: Num a => a
```

↑関数じゃない、「-4」という数!
`Num a => a`という型は、「`Num`型クラスのインスタンスである型のうちのいずれか」です。つまり`(- 4)`は、整数など何らかの数値を表す型の値なんですね。そう、やはり`(- 4)`は単なる`-4`という数値型の値であり、演算子のセクションによって作ることができる「左辺の値を受け取って4引く関数」ではないのです。

これは、我々が`-`を利用する際の習慣に従うために定められた、`-`に対する特別扱いです。ちなみに`-``4`の間にスペースを入れようと入れまいと、結果は変わりません:

```haskell
ghci> (-4)
-4
ghci> :t (-4)
(-4) :: Num a => a

ghci> (- 4)
-4
ghci> :t (- 4)
(- 4) :: Num a => a
```

hoge

```haskell
ghci> :t (4 -)
(4 -) :: Num a => a -> a
```

↑こちらは関数

```
ghci> (- 4) 4
<interactive>:135:1: error:
? Non type-variable argument in the constraint: Num (t1 -> t2)
(Use FlexibleContexts to permit this)
? When checking the inferred type
it :: forall t1 t2. (Num t1, Num (t1 -> t2)) => t2
ghci> (4 -) 4
0
Expand Down

0 comments on commit 70a64b2

Please sign in to comment.