gpt4 book ai didi

haskell - 为什么 Haskell 中的 if 表达式不受欢迎?

转载 作者:行者123 更新时间:2023-12-03 10:44:12 25 4
gpt4 key购买 nike

这是我一直想知道的一个问题。 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)

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

最佳答案

你的例子的问题不是 if表达式,它是使用部分函数,​​如 headtail .如果您尝试使用空列表调用其中任何一个,则会引发异常。

> head []
*** Exception: Prelude.head: empty list
> tail []
*** Exception: Prelude.tail: empty list

如果在使用这些函数编写代码时出错,直到运行时才会检测到错误。如果您在模式匹配方面犯了错误,您的程序将无法编译。

例如,假设您不小心切换了 thenelse你的功能的一部分。
-- Compiles, throws error at run time.
sum xs = if null xs then (head xs) + sum (tail xs) else 0

-- Doesn't compile. Also stands out more visually.
sum [] = x + sum xs
sum (x:xs) = 0

请注意,您的 guard 示例也有同样的问题。

关于haskell - 为什么 Haskell 中的 if 表达式不受欢迎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16572446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com