haskell-jp / questions #96 at 2021-04-12 16:51:48 +0900

はじめまして,本日参加させていただきました.いきなりですが質問失礼します.
こちらと同じ機能をcaseを使って書くことはできるのでしょうか?
すべて`x`でマッチしてガード式を使うというのは自分で思いつきました
Hiromi ISHII / mr_konn
case にこだわらなければ、MultiWayIf 拡張を使って以下のように書けますね:

{-# LANGUAGE MultiWayIf #-}

-- ...

if | n < 1 -> "top"
   | 1 <= n && n <= 5 -> "middle"
   | otherwise -> "back"
ほえーこんな文法実装されてるんですね
どちらにせよ最初に提示したものはあまり推奨されない感じですか?
Hiromi ISHII / mr_konn
好みやコード規約によると思います。二重の if くらいなら MultiWayIf を使わないでネストした if で書くこともときどきありますし、MultiWayIf は一応 GHC の独自拡張なので、標準言語仕様に準拠したい場合は case () of _ | ... -> で書いたりネスト if で書いたりすることになると思います。
Hiromi ISHII / mr_konn
MultiWayIf は実質的に case + guard と同値なので、最後の otherwise -> に準ずる節を忘れると partial になってしまう(if の用に必ず else 節が存在するわけではなくなってしまう)ので、そういう点から避けたいと思う場合もあるかもしれません
Hiromi ISHII / mr_konn
使っているコードフォーマッタによっては、ネストでどんどんインデントが深まっていって見辛いので、特にそういう規約でなければ僕じしんは MultiWayIf を使いますね
わかりました
ご丁寧に回答していただきありがとうございました.
if c then t else f



case c of
  True  -> t
  False -> f

の構文糖衣ですよ。
@basashi 念のため ping しておきますね。