假设我有一个 Vector
数据类型定义如下:
data Vector = Vector { x :: Double
, y :: Double
, z :: Double
}
使用成员访问来定义函数是否更常见:
vecAddA v w
= Vector (x v + x w)
(y v + y w)
(z v + z w)
或使用模式匹配:
vecAddB (Vector vx vy vz) (Vector wx wy wz)
= Vector (vx + wx)
(vy + wy)
(vz + wz)
(抱歉,如果我有任何不正确的术语)。
最佳答案
我通常会使用模式匹配,特别是因为您使用了所有构造函数的参数并且它们并不多。此外,在此示例中,这不是问题,但请考虑以下事项:
data Foo = A {a :: Int} | B {b :: String}
fun x = a x + 1
如果您使用模式匹配来处理 Foo 类型,那么您是安全的;无法访问不存在的成员。另一方面,如果使用访问器函数,一些操作,例如调用
fun (B "hi!")
这里会导致运行时错误。编辑:虽然很可能忘记在某些构造函数上进行匹配,但模式匹配非常明确地表明发生的情况取决于使用的构造函数(您也可以告诉编译器检测不完整的模式并警告您)而使用一个函数的提示比任何构造函数都要多,IMO。
访问器最好保存在您只想获取构造函数的一个或几个(可能很多)参数并且您知道使用它们是安全的情况下(没有在错误构造函数上使用访问器的风险,如示例.)
关于Haskell:更喜欢模式匹配还是成员访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6913130/