Skip to content

Commit a0e0860

Browse files
committed
Explain GHC's -Wall option
1 parent e75a21d commit a0e0860

File tree

2 files changed

+13
-29
lines changed

2 files changed

+13
-29
lines changed

assets/18.md

+12-27
Original file line numberDiff line numberDiff line change
@@ -1061,46 +1061,31 @@ ghci> getMaybeString Nothing = "Nothing!"
10611061
dangerous = \(Just x) -> x
10621062
```
10631063

1064-
みたいに書きたくなったら、↓のような`case`に変換するしかない(`LambdaCase`についてはいつか脚注に)。
1064+
もし上↑のように書きたくなったら、必ず下↓のような`case`式に変換してください[^3]:
10651065

1066-
```
1066+
[^3]: `LambdaCase`というGHCの言語拡張を使う手もありますので、興味のある方は調べてみてください。
1067+
1068+
```haskell
10671069
dangerous = \mx ->
10681070
case mx of
10691071
Just x -> ...
10701072
Nothing -> ...
10711073
```
10721074

1073-
結果、うっかり`Nothing`が渡されてエラーになってしまうことも
1074-
1075-
```
1076-
ghci> dangerous Nothing
1077-
*** Exception: <interactive>:8:2-15: Non-exhaustive patterns in lambda
1078-
```
1075+
`dangerous = \(Just x) -> x`のように分岐できないパターンマッチをするのは、ここまで説明したとおり例外が発生する原因になるので、`-Wall`というオプション[^4]で警告を有効にしていると警告が出ます:
10791076

1080-
警告を有効にしても教えてくれない😱
1077+
[^4]: GHC 9.0以前の場合、`-Wall`を有効にしてもこの警告は出ません。`-Wincomplete-uni-patterns`を有効にしなければならないのでご注意ください。
10811078

1082-
```
1079+
```haskell
1080+
-- GHCiで警告を有効にする手段については課題hoge(7?)を参照してください
10831081
ghci> :set -Wall
1084-
ghci> dangerous = (\(Just x) -> x)
1085-
```
1086-
1087-
`-Wincomplete-uni-patterns`を有効にしないといけない!
10881082

1089-
```
1090-
ghci> :set -Wincomplete-uni-patterns
10911083
ghci> dangerous = \(Just x) -> x
10921084

1093-
<interactive>:10:2: warning: [-Wincomplete-uni-patterns]
1085+
<interactive>:11:13: warning: [-Wincomplete-uni-patterns]
10941086
Pattern match(es) are non-exhaustive
1095-
In a lambda abstraction: Patterns not matched: Nothing
1087+
In a lambda abstraction:
1088+
Patterns of type Maybe a not matched: Nothing
10961089
```
10971090

1098-
[GHCの将来のバージョンで、`-Wincomplete-uni-patterns``-Wall`に含まれる][7]かも。
1099-
1100-
[7]: https://gitlab.haskell.org/ghc/ghc/issues/15656
1101-
1102-
`-Wall`を有効にしても有効にならない警告の一覧は[GHC Users Guide][8]を参照。
1103-
1104-
<https://functor.tokyo/blog/2017-07-28-ghc-warnings-you-should-enable>
1105-
1106-
[8]: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-warnings.html#ghc-flag--Wall
1091+
`-Wall`というオプションは、GHCが出すことのできるほとんどの警告を有効にするオプションです。普段プログラムを書くときはこのオプションを有効にして、問題のあるコードを見つける手がかりにするのをおすすめします。

assets/7.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -421,8 +421,7 @@ ghci> :t 1 + 2 * 3
421421
それは、課題5でも少し触れた「デフォルトの型」です。
422422
`Num`型クラスをはじめとする一部の型クラスには、「型推論したけど型を決定することが出来なかった。でも、この型は○○の型クラスのインスタンスであることは間違いないので、デフォルトの型である××に決定してしまおう」という型が決められています。それが「デフォルトの型」です。
423423

424-
その挙動を確認するために、GHCの`-Wtype-defaults`という警告を有効にしましょう。
425-
GHCiでこの警告を有効にするには、`:set -Wtype-defaults`と入力します。
424+
その挙動を確認するために、GHCの`-Wtype-defaults`というオプションで`type-defaults`という警告を有効にしましょう。GHCiでこの警告を有効にするには、`:set -Wtype-defaults`というコマンドを入力します:
426425

427426
```haskell
428427
ghci> :set -Wtype-defaults

0 commit comments

Comments
 (0)