为什么函数定义中首选模式匹配?

Zel*_*ahl 6 haskell function signature pattern-matching

我读从"learnyouahaskell"教程learnyouahaskell.它写着:

模式匹配也可以用在元组上.如果我们想要创建一个在2D空间中采用两个向量(以对形式)并将它们加在一起的函数,该怎么办?为了将两个向量相加,我们分别添加它们的x组件,然后分别添加它们的组件y.如果我们不了解模式匹配,我们将如何做到这一点:

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)  
addVectors a b = (fst a + fst b, snd a + snd b)  
Run Code Online (Sandbox Code Playgroud)

嗯,这有效,但有一个更好的方法来做到这一点.让我们修改函数,使其使用模式匹配.

addVectors :: (Num a) => (a, a) -> (a, a) -> (a, a)  
addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)  
Run Code Online (Sandbox Code Playgroud)

我们去!好多了.请注意,这已经是一个包罗万象的模式.addVectors(在两种情况下)的类型都是addVectors :: (Num a) => (a, a) -> (a, a) - > (a, a),所以我们保证得到两对作为参数.

我的问题是:如果两个定义产生相同的签名,为什么模式匹配首选首选方式?

wir*_*res 5

我认为在这种情况下,模式匹配更直接地表达了您的意思.

在函数应用程序的情况下,需要知道做什么fstsnd做什么,并从中推断出a并且b是元素被添加的元组.

addVectors a b = (fst a + fst b, snd a + snd b)
Run Code Online (Sandbox Code Playgroud)

我们拥有sndfst分解元组的功能这一事实让人分心.

在模式匹配情况下,它是立即清除输入的是什么(元组的元素,我们呼吁x1y1和一个元组...等),以及它是如何解构.它也立即清楚发生了什么,如何添加它们的元素.

addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)
Run Code Online (Sandbox Code Playgroud)

这几乎就像数学定义:

(x 1,y 1)+(x 2,y 2):=(x 1 + x 2,y 1 + y 2)

直截了当,没有分心:-)

你可以在Haskell中写下这个:

(x?, y?) `addVector` (x?, y?) = (x? + x?, y? + y?)
Run Code Online (Sandbox Code Playgroud)