Haskell 如何使用NumericPrelude定义新单位

Haskell 如何使用NumericPrelude定义新单位,haskell,Haskell,我需要一些单位,以避免混合的东西,如数量,数量价格等。。。我真的不关心物理尺寸,但我需要将它们彼此隔离。我在阴谋集团看到过一些“单位”套餐,但它们要么不够好,要么对工作来说太重 由于问题很简单,我想我可以自己做,然后创建一些派生Num的新类型 派生Num的好处在于,您可以将数字相加,并通过fromInteger自动转换它们。缺点是你也可以将它们相乘,这是我不想要的。价格乘以价格不是价格 所以我开始思考,Num类包含了*而实际上并不需要它,这是一个遗憾。也许我可以重写我自己的Num类,这样我就可以

我需要一些单位,以避免混合的东西,如数量,数量价格等。。。我真的不关心物理尺寸,但我需要将它们彼此隔离。我在阴谋集团看到过一些“单位”套餐,但它们要么不够好,要么对工作来说太重

由于问题很简单,我想我可以自己做,然后创建一些派生Num的新类型

派生Num的好处在于,您可以将数字相加,并通过
fromInteger
自动转换它们。缺点是你也可以将它们相乘,这是我不想要的。价格乘以价格不是价格

所以我开始思考,
Num
类包含了
*
而实际上并不需要它,这是一个遗憾。也许我可以重写我自己的
Num
类,这样我就可以重用
+
形成我的新类型。想到这一点,我无意中发现了数字序曲应该是怎样的。此外,它有一些单位的能力,但文件是简洁的。您知道我如何使用它来基本设置以下装置:

  • 数量
  • 价格
  • 金额=数量*价格
更新 对于那些想知道为什么数量不是无量纲的,为什么价格和数量不同的人来说,原因是:

  • 数量
    指的是数量,例如
    1个土豆
    。乘法
    Quantity
    没有意义(什么是土豆^2),但是
    Quantity
    是一个(加法)
    Monoid
  • Price
    实际上是
    Currency/Potato
    。添加
    Price
    是有意义的,但它不是
    Monoid
    ,因为我无法减少价格列表。我需要一个按数量加权的平均值

  • Amount
    Currency
    并且它是一个(加法)
    Monoid
    。 我不想因为这个原因而混淆价格和金额:我可以
    mappend
    一个
    Amount
    列表,但我不想用
    Price
    这样做。要获得平均价格,我必须
    mconcat
    [(数量、金额)]
    并进行分割


要重新表述我的问题,如何使用
NumericPrelude
软件包或其他软件包实现这一点?

您考虑过吗?它为您提供了非常精确的界面,使一些物理量可以相加和恒定可伸缩,而不会像数字序曲那样完全改变一切。当然,您需要编写
^+^
而不是
+
,但我认为这不是什么大问题。我不知道这个包。有太多的包裹和阴谋集团,因此显然不是寻求推荐的地方;-)。我来看看。你能解释一下为什么数量*价格是数量而不是价格吗?你的要求是矛盾的。如果体积*数量是体积,那么数量是无量纲的,数量是价格。@n.m我知道。我可能看起来很花哨,但这是有原因的。此外,如果创建自己的
Multiply
类,我可以很容易地做到这一点,因此我没有理由不这样做。查看我的更新