Haskell 为具有相同行为的两类对象建模
我有两种属性相同的对象,即:Haskell 为具有相同行为的两类对象建模,haskell,Haskell,我有两种属性相同的对象,即:Fuel和AdBlue。两者都是流体,它们共享相同的逻辑 data Fluid a = Fluid { volume :: Double, price :: Double, kind :: a } volume和price字段必须为非负数。kind字段用于区分流体的类型。我尝试了以下代码 data FuelType = Diesel | SuperE10 -- 90% octane with 10% ethanol (Super is gasoline)
Fuel
和AdBlue
。两者都是流体,它们共享相同的逻辑
data Fluid a = Fluid { volume :: Double, price :: Double, kind :: a }
volume
和price
字段必须为非负数。kind
字段用于区分流体的类型。我尝试了以下代码
data FuelType
= Diesel
| SuperE10 -- 90% octane with 10% ethanol (Super is gasoline)
| Super -- 95% octane
| SuperPlus -- 98% octane
| LPG
type Fuel = Fluid Fueltype
然而,这使得API使用起来非常笨拙,而且感觉不太对劲。你会怎么做
这些类型用于确定车辆是否可以使用特定类型的燃油加油。例如,你不能给柴油发动机加满汽油,反之亦然。采用新EURO6排放标准的柴油发动机需要AdBlue。种类::燃料类型,否a如何?这取决于它们在计划后期的使用方式。如果只是定价问题,为什么不
datafluid=Diesel{…}汽油{…}LPG{…}AdBlue{…}
其中省略号总是volume::Double,price::Double
。也许具有
类型类模式对您有好处。我们的想法是创建一个名为HasFluidProperties
的类型类,它有两种方法:volume
和price
。然后实例化FuelType
,或者如果愿意,为每个案例创建不同的类型。类型族可能是一种解决方案。看见引擎与它可以使用的燃料类型之间的关系感觉类似于地图与它使用的键类型之间的关系。kind::fueltype,no a如何?这取决于它们在程序中的后续使用方式。如果只是定价问题,为什么不datafluid=Diesel{…}汽油{…}LPG{…}AdBlue{…}
其中省略号总是volume::Double,price::Double
。也许具有
类型类模式对您有好处。我们的想法是创建一个名为HasFluidProperties
的类型类,它有两种方法:volume
和price
。然后实例化FuelType
,或者如果愿意,为每个案例创建不同的类型。类型族可能是一种解决方案。看见引擎与它可以使用的燃料类型之间的关系感觉类似于地图与它使用的关键点类型之间的关系。