gpt4 book ai didi

haskell - 由于等效的构造函数而避免样板代码

转载 作者:行者123 更新时间:2023-12-02 13:28:57 25 4
gpt4 key购买 nike

我的 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。我将有更多的值构造函数,因此这将被重复更多。对我来说,这是代码味道,但我不知道如何重构它以消除重复的代码。有没有一种实用的方法可以避免这种重复的代码?这是一个微不足道的例子,因为我已经将真正的问题简化为简单的要点来解释问题。

最佳答案

你是对的。这是一种代码味道,实际上是一个非常常见的建模错误。您所需要做的只是将费率类型排除在外。例如,

data RateType = Fixed | Floating

data Bond = Bond RateType Float Float

然后你就会拥有

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

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

基本上,这里的经验法则是:如果您有多个构造函数实现相同的功能,则必须有一个枚举要求被分解。

关于haskell - 由于等效的构造函数而避免样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32671988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com