Почему в Хаскеле не одобряются выражения?

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

Как второй вопрос, какой из этих вариантов рассматривается "лучшая практика » и почему? Мой профессор, когда всегда использовал первый метод, когда это было возможно, и ямне интересно, если этоЭто просто его личное предпочтение или если что-то было за этим.

Ответы на вопрос(6)

Ваш ответ на вопрос