Skip to content

Commit 1fb0977

Browse files
committed
Complete description of pattern-matching by the labels of the constructor fields
1 parent 3c9d773 commit 1fb0977

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

assets/18.md

+46
Original file line numberDiff line numberDiff line change
@@ -907,12 +907,58 @@ ghci| formatEntry (Entry { category = cat, price = pri }) = cat ++ ": " ++ show
907907
ghci| :}
908908
```
909909

910+
<!--
911+
```haskell
912+
-- ... さっきと同様に動作確認します ...
913+
ghci> entry = Entry "" 999999999999999
914+
ghci> formatEntry entry
915+
"<Unknown category>: 999999999999999"
916+
ghci> entry = Entry "Magazine" 120
917+
ghci> formatEntry entry
918+
"Magazine: 120"
919+
```
920+
-->
921+
910922
パターンマッチしている部分のみ切り出してみます:
911923

912924
```haskell
925+
Entry { category = "", price = pri }
913926
Entry { category = cat, price = pri }
914927
```
915928

929+
最初に紹介したパターンマッチ(`(Entry "" pri)``(Entry cat pri)`)と異なり、
930+
931+
1. まず値コンストラクター`Entry`の後ろに、ブレースで囲ってパターンマッチするレコードラベルや変数を列挙しています
932+
2. そして、レコードラベルと変数(あるいはマッチさせたい値)の間に`=`を書いて結びつけます
933+
934+
このように書くことで、先程と同様に`category``price`の値をそれぞれ`cat``pri`に割り当てたりする`formatEntry`を定義できます。
935+
936+
レコードラベルを使ったパターンマッチの大きなアドバンテージは、フィールドの順番に依存しないことです。従って、`formatEntry`関数は次のように`category``price`をマッチさせる順番を入れ替えても同じように振る舞います:
937+
938+
```haskell
939+
ghci> :{
940+
ghci| formatEntry :: Entry -> String
941+
ghci| formatEntry (Entry { price = pri, category = "" }) = "<Unknown category>" ++ ": " ++ show pri
942+
ghci| formatEntry (Entry { price = pri, category = cat }) = cat ++ ": " ++ show pri
943+
ghci| :}
944+
```
945+
946+
<!--
947+
```haskell
948+
-- ... 動作確認 ...
949+
ghci> entry = Entry "" 999999999999999
950+
ghci> formatEntry entry
951+
"<Unknown category>: 999999999999999"
952+
ghci> entry = Entry "Magazine" 120
953+
ghci> formatEntry entry
954+
"Magazine: 120"
955+
```
956+
-->
957+
958+
##### おまけ: パターンマッチと値の定義
959+
960+
hoge
961+
916962
#### タプルに対する関数の引数でのパターンマッチ
917963

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

0 commit comments

Comments
 (0)