これは私がしばらく疑問に思っていた質問です。if ステートメントは、ほとんどのプログラミング言語 (少なくとも私が使用したプログラミング言語) の定番ですが、Haskell ではかなり嫌われているようです。複雑な状況では、Haskell のパターン マッチングは一連の if よりもはるかにクリーンであることは理解していますが、実際の違いはありますか?
簡単な例として、自家製バージョンの sum を取り上げます (そうです、単に である可能性があることはわかっていますfoldr (+) 0
)。
sum :: [Int] -> Int
-- separate all the cases out
sum [] = 0
sum (x:xs) = x + sum xs
-- guards
sum xs
| null xs = 0
| otherwise = (head xs) + sum (tail xs)
-- case
sum xs = case xs of
[] -> 0
_ -> (head xs) + sum (tail xs)
-- if statement
sum xs = if null xs then 0 else (head xs) + sum (tail xs)
2 番目の質問として、これらのオプションのどれが「ベスト プラクティス」と見なされ、その理由は? 私の教授は、可能な限り常に最初の方法を使用していましたが、それが彼の個人的な好みなのか、それとも背後に何かがあるのか 疑問に思っています。