我需要某种单位来避免混合诸如数量,体积等等之类的东西......我并不真正关心物理尺寸,但我需要将它们彼此隔离。我已经在cabal上看到了几个“单位”套餐,但它们看起来要么不够好,要么对工作很重。
由于问题很简单,我认为我可以自己做,只需创建一些衍生Num的新类型。
导出Num的好处是你可以在一起添加数字,并通过fromInteger
自动投射。缺点是你也可以把它们加在一起,这是我不想要的。价格乘以价格不是一个价格。
所以我开始思考,Num
类包含*
并不是必需的,这是遗憾的。也许我可以重写我自己的Num
类,这样我就可以重用+
形成我的新类型。考虑到这一点,我偶然发现NumericPrelude,这似乎是数字前奏应该是多少。此外,它有一些单元功能,但文档很简洁。你知道如何使用它基本上设置以下单位:
对于想知道为什么数量不是无量纲以及为什么Price
与Amount
不同的人,原因是:
Quantity
指的是一些片段,1 Potato
。乘以Quantity
没有意义(什么是马铃薯^ 2),但Quantity
是(加法)Monoid
。 Price
实际上是Currency/Potato
。添加Price
是有道理的,但它不是Monoid
,因为我无法减少价格列表。我需要按数量平均加权。
Amount
是Currency
,它是(添加剂)Monoid
。
出于这个原因,我不想混淆价格和金额:我可以mappend
列出Amount
,但我不希望Price
这样做。要获得平均价格,我必须mconcat
[(Quantity, Amount)]
并进行划分。
要重新构建我的问题,如何使用NumericPrelude
包或其他方法实现此目的?