如何使用数字前奏定义新单位

时间:2014-07-08 08:27:02

标签: haskell

我需要某种单位来避免混合诸如数量,体积等等之类的东西......我并不真正关心物理尺寸,但我需要将它们彼此隔离。我已经在cabal上看到了几个“单位”套餐,但它们看起来要么不够好,要么对工作很重。

由于问题很简单,我认为我可以自己做,只需创建一些衍生Num的新类型。

导出Num的好处是你可以在一起添加数字,并通过fromInteger自动投射。缺点是你也可以把它们加在一起,这是我不想要的。价格乘以价格不是一个价格。

所以我开始思考,Num类包含*并不是必需的,这是遗憾的。也许我可以重写我自己的Num类,这样我就可以重用+形成我的新类型。考虑到这一点,我偶然发现NumericPrelude,这似乎是数字前奏应该是多少。此外,它有一些单元功能,但文档很简洁。你知道如何使用它基本上设置以下单位:

  • 数量
  • 价格
  • 金额=数量*价格

更新

对于想知道为什么数量不是无量纲以及为什么PriceAmount不同的人,原因是:

  • Quantity指的是一些片段,1 Potato。乘以Quantity没有意义(什么是马铃薯^ 2),但Quantity是(加法)Monoid
  • Price实际上是Currency/Potato。添加Price是有道理的,但它不是Monoid,因为我无法减少价格列表。我需要按数量平均加权。

  • AmountCurrency,它是(添加剂)Monoid。 出于这个原因,我不想混淆价格和金额:我可以mappend列出Amount,但我不希望Price这样做。要获得平均价格,我必须mconcat [(Quantity, Amount)]并进行划分。

要重新构建我的问题,如何使用NumericPrelude包或其他方法实现此目的?

0 个答案:

没有答案