Haskell 如何使用NumericPrelude定义新单位
我需要一些单位,以避免混合的东西,如数量,数量价格等。。。我真的不关心物理尺寸,但我需要将它们彼此隔离。我在阴谋集团看到过一些“单位”套餐,但它们要么不够好,要么对工作来说太重 由于问题很简单,我想我可以自己做,然后创建一些派生Num的新类型 派生Num的好处在于,您可以将数字相加,并通过Haskell 如何使用NumericPrelude定义新单位,haskell,Haskell,我需要一些单位,以避免混合的东西,如数量,数量价格等。。。我真的不关心物理尺寸,但我需要将它们彼此隔离。我在阴谋集团看到过一些“单位”套餐,但它们要么不够好,要么对工作来说太重 由于问题很简单,我想我可以自己做,然后创建一些派生Num的新类型 派生Num的好处在于,您可以将数字相加,并通过fromInteger自动转换它们。缺点是你也可以将它们相乘,这是我不想要的。价格乘以价格不是价格 所以我开始思考,Num类包含了*而实际上并不需要它,这是一个遗憾。也许我可以重写我自己的Num类,这样我就可以
fromInteger
自动转换它们。缺点是你也可以将它们相乘,这是我不想要的。价格乘以价格不是价格
所以我开始思考,Num
类包含了*
而实际上并不需要它,这是一个遗憾。也许我可以重写我自己的Num
类,这样我就可以重用+
形成我的新类型。想到这一点,我无意中发现了数字序曲应该是怎样的。此外,它有一些单位的能力,但文件是简洁的。您知道我如何使用它来基本设置以下装置:
- 数量
- 价格
- 金额=数量*价格
指的是数量,例如数量
。乘法1个土豆
没有意义(什么是土豆^2),但是Quantity
是一个(加法)Quantity
Monoid
实际上是Price
。添加Currency/Potato
是有意义的,但它不是Price
,因为我无法减少价格列表。我需要一个按数量加权的平均值Monoid
是Amount
并且它是一个(加法)Currency
。 我不想因为这个原因而混淆价格和金额:我可以Monoid
一个mappend
列表,但我不想用Amount
这样做。要获得平均价格,我必须Price
mconcat
并进行分割[(数量、金额)]
要重新表述我的问题,如何使用
NumericPrelude
软件包或其他软件包实现这一点?您考虑过吗?它为您提供了非常精确的界面,使一些物理量可以相加和恒定可伸缩,而不会像数字序曲那样完全改变一切。当然,您需要编写^+^
而不是+
,但我认为这不是什么大问题。我不知道这个包。有太多的包裹和阴谋集团,因此显然不是寻求推荐的地方;-)。我来看看。你能解释一下为什么数量*价格是数量而不是价格吗?你的要求是矛盾的。如果体积*数量是体积,那么数量是无量纲的,数量是价格。@n.m我知道。我可能看起来很花哨,但这是有原因的。此外,如果创建自己的Multiply
类,我可以很容易地做到这一点,因此我没有理由不这样做。查看我的更新