这是我一直想知道的一个问题。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)
作为第二个问题,这些选项中的哪一个被认为是“最佳实践”,为什么?我的教授回到过去时总是尽可能使用第一种方法,我想知道这只是他的个人喜好还是背后有什么东西。