Это был вопрос, который я задавал некоторое время. если утверждения являются главными в большинстве языков программирования (по крайней мере, с теми, с которыми я работал), но в Haskell кажется, что это довольно неодобрительно. Я понимаю, что для сложных ситуаций совпадение шаблонов Haskell намного чище, чем куча ifs, но есть ли какая-то реальная разница?
Для простого примера возьмите самодельную версию суммы (да, я знаю, что это может быть только 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)
Как второй вопрос, какой из этих вариантов считается "лучшей практикой" и почему? Мой профессор вернулся, когда всегда использовал первый метод, когда это было возможно, и мне интересно, только ли это его личное предпочтение или что-то позади.