Haskell:更喜欢模式匹配还是成员访问?

标签 haskell coding-style

假设我有一个 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/

相关文章:

haskell - 将表达式转换为字符串表示形式?

debugging - 我如何使用 GHC.Exts.breakpoint?

.net - 如何避免硬编码字符串

javascript函数随机css样式

android - 更改 ListView 中某些项目的样式时出现问题

haskell - monad 中的可变参数函数

haskell - 将num的类型签名加倍?

haskell - 我怎样才能把它写成隐式递归?

c++ - 我应该对(数组索引)范围使用什么类型?

coding-style - 在 Pharo 中保存方法的自动格式化