【问题标题】:What are advantages of pattern matching over conditionals in FP (in layman's terms)?与 FP 中的条件匹配相比,模式匹配有哪些优势(用外行的话来说)?
【发布时间】:2019-10-06 17:15:26
【问题描述】:
通俗地说,除了历史原因之外,模式匹配到底有什么好处?我遇到的答案大多超出了我的水平(例如我不明白堆分配与此有什么关系)。
我有 Python 的背景,最近才重新开始学习 Haskell。
所以我很难理解在其他语言背景下给出的其他答案。
【问题讨论】:
标签:
haskell
functional-programming
pattern-matching
conditional-statements
【解决方案1】:
使用模式匹配而不是条件匹配最有用的方面之一是允许 API 仅涉及 total 操作,即永远不会导致运行时异常/错误的操作。
考虑这段代码,利用假设函数runOperationOn,返回Maybe String。
case runOperationOn someData of
Just res -> putStrLn ("The operation was successful: " ++ res)
Nothing -> putStrLn "The operation failed!"
这里,模式匹配允许检查操作是否成功,并在成功时得到结果,同时。最后一部分很关键。使用布尔值,我们需要使用类似的东西:
if canRunOperationOn someData
then putStrLn ("The operation was successful: " ++ doRunOperationOn someData)
else putStrLn "The operation failed!"
这看起来很相似,但与模式匹配相比,它有很大的缺点:
- 它将功能分为两个功能:一个是检查我们是否可以执行操作,另一个是实际执行。
- 它涉及一个部分函数
doRunOperationOn,它返回一个String,但会在无效输入时崩溃。
后者相当糟糕,因为它给程序员带来了一些负担,程序员必须记住问“我可以吗?”,否则会面临崩溃的风险。