Zel*_*ahl 6 haskell function signature pattern-matching
我读从"learnyouahaskell"教程learnyouahaskell.它写着:
模式匹配也可以用在元组上.如果我们想要创建一个在2D空间中采用两个向量(以对形式)并将它们加在一起的函数,该怎么办?为了将两个向量相加,我们分别添加它们的
x组件,然后分别添加它们的组件y.如果我们不了解模式匹配,我们将如何做到这一点:Run Code Online (Sandbox Code Playgroud)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)我们去!好多了.请注意,这已经是一个包罗万象的模式.
addVectors(在两种情况下)的类型都是addVectors :: (Num a) => (a, a) -> (a, a) - > (a, a),所以我们保证得到两对作为参数.
我的问题是:如果两个定义产生相同的签名,为什么模式匹配首选首选方式?
我认为在这种情况下,模式匹配更直接地表达了您的意思.
在函数应用程序的情况下,需要知道做什么fst和snd做什么,并从中推断出a并且b是元素被添加的元组.
addVectors a b = (fst a + fst b, snd a + snd b)
Run Code Online (Sandbox Code Playgroud)
我们拥有snd和fst分解元组的功能这一事实让人分心.
在模式匹配情况下,它是立即清除输入的是什么(元组的元素,我们呼吁x1并y1和一个元组...等),以及它是如何解构.它也立即清楚发生了什么,如何添加它们的元素.
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)