与FP中的条件匹配相比,模式匹配有哪些优势(以非专业人士的说法)?

joh*_*321 5 haskell functional-programming pattern-matching conditional-statements

外行的话来说,模式匹配的好处到底是什么,除了历史原因之外?我遇到的答案大多超出了我的水平(例如,我不了解与此有关的堆分配)。

我有Python背景,直到最近才再次接触Haskell。

因此,我很难理解在其他语言环境中给出的其他答案。

chi*_*chi 10

使用模式匹配而不是条件匹配的最有用的方面之一是允许API仅涉及全部操作,即,永远不会导致运行时异常/错误的操作。

考虑一下此代码,利用一个假设函数runOperationOn,返回Maybe String

case runOperationOn someData of
   Just res -> putStrLn ("The operation was successful: " ++ res)
   Nothing  -> putStrLn "The operation failed!"
Run Code Online (Sandbox Code Playgroud)

这里,模式匹配允许检查操作是否成功,并获得成功的结果,在同一时间。最后一部分至关重要。使用布尔值,我们将需要使用类似以下内容的方法:

if canRunOperationOn someData
then putStrLn ("The operation was successful: " ++ doRunOperationOn someData)
else putStrLn "The operation failed!"
Run Code Online (Sandbox Code Playgroud)

这看起来很相似,但是与模式匹配相比有很多缺点:

  • 它将功能分为两个功能:一个用于检查我们是否可以执行该操作,另一个用于实际执行操作。
  • 它包含一个返回a 的局部函数,但在无效输入时会崩溃。doRunOperationOnString

后者相当糟糕,因为这给程序员带来了负担,程序员必须记住问“我可以吗?”,否则就有崩溃的危险。