ghcでビルドするときに-Wallをつけてwarningをすべて表示するようにして、いまさらにして初めてわかったこと: caseでotherwiseを使うのはまちがい nt = case pltype of SmallMonao -> SuperMonao SuperMonao -> FireMonao otherwise -> pltype -- まちがい! otherwiseはガードのときに使う、というか単にotherwise = Trueと定義されてるだけなので、シャドウされた変数パターンとして捕捉されてるだけだった。正しくはワイルドカードを使って nt = case pltype of SmallMonao -> SuperMonao SuperMonao -> FireMonao _ -> pltype caseをRubyやSchemeのcaseと混同して、束縛された名前でマッチ