Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为具有相同行为的两类对象建模_Haskell - Fatal编程技术网

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
,或者如果愿意,为每个案例创建不同的类型。类型族可能是一种解决方案。看见引擎与它可以使用的燃料类型之间的关系感觉类似于地图与它使用的关键点类型之间的关系。