【发布时间】:2016-02-05 19:29:38
【问题描述】:
我正在阅读来自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)嗯,这行得通,但有更好的方法来做到这一点。让我们修改 函数,以便它使用模式匹配。
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也可以理解函数... -
并且无意冒犯但这只是一个征求意见的问题 - 永远不会有答案(或任何正确的答案) ) - 这就是我投票关闭它的原因
-
@Carsten 嗯,您可能对可读性有所了解。我读了它并在想:但在更多代码中也是如此。既然您提到不必知道
fst和snd,我可以看到这可能具有可读性优势。 -
如果您进行一些细微的布局修改,模式匹配版本看起来会更好,例如
addVectors (x₁,y₁) (x₂,y₂) = (x₁+x₂, y₁+y₂)。
标签: function haskell pattern-matching signature