M.K*_*.K. 3 haskell functional-programming
我有一个ADT如下:
Prelude> data Bond = FixedRateBond Float Float | FloatingRateBond Float Float
Run Code Online (Sandbox Code Playgroud)
我想对此ADT的每个值构造函数执行如下操作:
Prelude> let foo :: Bond -> Float
Prelude| foo (FixedRateBond a b) = a + b
Prelude| foo (FloatingRateBond a b) = a + b
Run Code Online (Sandbox Code Playgroud)
如你所见,我在这里有代码重复; 我拥有的每一个价值a + b.我会有更多的值构造函数,所以这将会重复更多.对我来说,这是代码味道,但我不知道如何重构它以消除重复的代码.有没有一种功能性的方法来避免这种重复的代码?这是一个微不足道的例子,因为我已经将真正的问题简化为解决问题的基本要素.
你说的没错.这是代码气味,实际上是一个非常常见的建模错误.您需要做的只是将费率类型考虑在内.例如,
data RateType = Fixed | Floating
data Bond = Bond RateType Float Float
Run Code Online (Sandbox Code Playgroud)
然后你会有
foo :: Bond -> Float
foo (Bond _ a b) = a + b
Run Code Online (Sandbox Code Playgroud)
RateType现在实际上是一种类型的其他好处,你可以拥有Enum和Bounded实例.
基本上,这里的经验法则是:如果你有多个构造函数实现相同的东西,那么必须有一个枚举,要求将其考虑在内.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |