由于等效的构造函数,避免样板代码

时间:2015-09-19 18:49:37

标签: haskell functional-programming

我的ADT如下:

Prelude> data Bond = FixedRateBond Float Float | FloatingRateBond Float Float

我想对此ADT的每个值构造函数执行如下操作:

Prelude> let foo :: Bond -> Float
Prelude|     foo (FixedRateBond a b) = a + b
Prelude|     foo (FloatingRateBond a b) = a + b

正如您所看到的,我在这里有代码重复;我拥有a + b的每一个价值。我会有更多的值构造函数,所以这将会重复更多。对我来说,这是代码味道,但我不知道如何重构它以消除重复的代码。有没有一种功能性的方法来避免这种重复的代码?这是一个微不足道的例子,因为我已经将真正的问题简化为解决问题的基本要素。

1 个答案:

答案 0 :(得分:6)

你是对的。这是代码气味,实际​​上是一个非常常见的建模错误。您需要做的只是将费率类型考虑在内。如,

data RateType = Fixed | Floating

data Bond = Bond RateType Float Float

然后你会

foo :: Bond -> Float
foo (Bond _ a b) = a + b

其他好处如RateType现在实际上是一种类型,您可以拥有EnumBounded个实例。

基本上,这里的经验法则是:如果你有多个构造函数实现相同的东西,那么必须有一个枚举,要求将其考虑在内。

相关问题