Skip to content

Commit

Permalink
(WIP) Explain how non-exhaustive pattern-maching is dangerous
Browse files Browse the repository at this point in the history
  • Loading branch information
igrep committed Jun 16, 2024
1 parent 3374689 commit 8dfc8de
Showing 1 changed file with 15 additions and 4 deletions.
19 changes: 15 additions & 4 deletions assets/18.md
Original file line number Diff line number Diff line change
Expand Up @@ -1031,17 +1031,28 @@ tupleToEntry = \(cat, pri) -> Entry cat pri

ラムダ抽象の引数におけるパターンマッチの方法は、以上の通り普通の関数定義などの場合と特に変わりません。しかしながらラムダ抽象の引数でのパターンマッチは、場合分けができないので注意が必要です。

例えば、
例えば、次のように`Maybe`型の値`Just`の場合に限り中身を取り出す関数をラムダ抽象で書いたとします:

```haskell
ghci> getMaybeValuebyForce = \(Just x) -> x
```

ラムダ抽象は
引数の値が`Nothing`の場合が書かれていませんね?このような場合、`getMaybeValuebyForce``Nothing`を渡すとどうなるのでしょう?

```haskell
ghci> getMaybeValuebyForce Nothing
*** Exception: <interactive>:4:24-37: Non-exhaustive patterns in lambda
```
dangerous (Just x) = x
dangerous Nothing = "error!"

`*** Exception:`で始まるエラーメッセージが出たところから分かるとおり、例外が発生してしまいました。このように、パターンマッチにおいて列挙できていないパターンの値がある場合、例外が発生する恐れがあります。課題hoge(12?)で触れたとおり、例外が発生してしまうと、原則としてプログラムは強制的に終了させられてしまうので、可能な限り避けたいものです。

hoge

```haksell
:{
ghci> getMaybeString (Just x) = x
ghci> getMaybeString Nothing = "error!"
:}
```

みたいに、関数定義の構文のように引数でパターンマッチしても場合分けができないので、
Expand Down

0 comments on commit 8dfc8de

Please sign in to comment.