Skip to content

Commit

Permalink
(WIP) Explain the relationship between pattern-matching and defining …
Browse files Browse the repository at this point in the history
…values
  • Loading branch information
igrep committed May 12, 2024
1 parent 661288a commit 8a21db7
Showing 1 changed file with 21 additions and 3 deletions.
24 changes: 21 additions & 3 deletions assets/18.md
Original file line number Diff line number Diff line change
Expand Up @@ -959,16 +959,34 @@ ghci> formatEntry entry

この節はパターンマッチと直接関係ありませんが、パターンマッチやレコード型を理解する上でとても重要な話なので取り上げます。

まずは課題hoge(6?)のおまけで紹介した、レコードラベルを使ってレコード型の値を定義する方法を思い出しましょう。例は例のごとく`Entry`型です:
まずは課題hoge(6?)のおまけで紹介した、レコードラベルを使ってレコード型の値を定義する方法を思い出しましょう。例のごとく例は`Entry`型です:

```haskell
ghci> categoryFirst = Entry { category = "Glasses", price = 23000 }
ghci> entry = Entry { category = "", price = 0 }
ghci> entry
hoge
Entry {category = "", price = 0}
```

この、`Entry { category = "", price = 0 }`という「カテゴリーも空っぽだし価格も0な`Entry`型の値」というのはちょっと変わっているように見えるので、これと同じような値であれば`True`、そうでなければ`False`を返す関数を書いてみましょう。

前の節で学習した、レコードラベルを使ったパターンマッチを使うと、次のように書けます:

```haskell
isEmptyEntry :: Entry -> Bool
isEmptyEntry (Entry { category = "", price = 0 }) = True
isEmptyEntry otherEntry = False
```

2行目の`isEmptyEntry (Entry { category = "", price = 0 }) = True`という行に注目してください。先程`entry = Entry { category = "", price = 0 }`と書いて`entry`を作るのに使用した`Entry { category = "", price = 0 }`という式が、ここでも使用されているのがわかるでしょうか?そう、パターンマッチでマッチさせる式を指定するのは、値を定義するのに用いる式と、全く同じ構文なのです。

このことは、パターンに変数が含まれている場合も同じです。hoge

値を定義する際に変数を参照するのと、パターンマッチでレコードの中にある値を変数に代入するのは、逆の動き

hoge

これまで紹介したものや、これ以降に紹介するパターンマッチの構文でも全く同じことが言えます。ぜひ覚えておいてください。

#### タプルに対する関数の引数でのパターンマッチ

便利なサンプルが[`Prelude`モジュール][6]にいくつかある。
Expand Down

0 comments on commit 8a21db7

Please sign in to comment.