#html{{
table border="0" cellpadding="5"><tr><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4908686076/vertex9-22/" target="_blank"><img src="" border="0"></a></td><td> </td><td valign="top"><a href="https://www.amazon.co.jp/exec/obidos/ASIN/4908686076/vertex9-22/" target="_blank">プログラミングHaskell 第2版</a><br>Grahum Hutton<br>ラムダノート<br>2019-08-02<br>¥ 3,456</td></tr></table>
}}
p.40
多くのプログラミング言語とは違って、Haskell の条件式には常に else部が必要です。
これにより、いわゆる「ぶらさがり else 問題」が回避できます。
もし else部が省略可能な文であるなら、文「if True then if False then 1 else 2」が 2を返すかエラーとなるかは、else部が内側と外側のどちらの条件に対応すると解釈するかに依存してしまうでしょう。
ぶら下がりelse(Dangling else)は、特定のif文に紐付くよう意図されていたelse文が、書き手の意図に反して異なる別のif文に紐付いてしまっている状態のことを言う。
この状態によって引き起こされる問題は宙ぶらりんelse問題(dangling else problem)とも呼ばれている。#code{{
if (!a)if (b) b();else // ← ぶら下がりのelse
a();
/* プログラム側ではこのように解釈されてしまう */
if (!a)
if (b) b(); else a();
}}
ぶら下がりelseの問題は、フリーフォーマットを採用し、かつブレース(波括弧 = {})の省略が可能なC言語やJava, PHP, Perl, JavaScript等の言語で頻繁に発生する。
オフサイドルールを採用して字下げのレベルに意味を持たせたPythonやCofeeScript等の言語ではこの問題は起こらない。
またブレースの記述を必須とするSwiftやGo, Rust等の言語も同様にこの問題は起こらない。
Haskellの場合は、ifはelseを必須にすることによって、曖昧さを排除しているんですね!