以通俗易懂的方式来说,除了历史原因外,模式匹配有哪些好处?我发现大多数答案超出了我的理解范围(例如,我不明白堆分配与此有什么关系)。
我有Python背景,最近才重新开始学习Haskell。
所以在其他语言的上下文中,我很难理解其他答案。
我有Python背景,最近才重新开始学习Haskell。
所以在其他语言的上下文中,我很难理解其他答案。
使用模式匹配而不是条件语句最有用的一个方面之一是可以允许仅涉及 total 操作的 API,即从不导致运行时异常/错误的操作。
考虑下面的代码,利用一个假设的函数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
,但在无效输入时会崩溃。后者很糟糕,因为它给程序员带来了一些负担,他必须记得要问“我可以吗?”或冒着崩溃的风险。