使用 dimensional-tf 包时,是否可以在不使用 Num 单元的情况下使用“普通” Int 实例(即 DoubleIntegerone )?

例如,此代码不键入检查(在 ghci 中):

{-# LANGUAGE NoMonomorphismRestriction #-}
import Numeric.Units.Dimensional.TF.Prelude
import qualified Prelude as P

fourpi = 4 * pi

但这段代码确实:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Numeric.Units.Dimensional.TF.Prelude
import qualified Prelude as P

fourpi = (4 *~ one) * (pi *~ one)

注意:让我知道我是否应该使用 dimensional 而不是 dimensional-tf

最佳答案

dimensional(和 dimensional-tf)包对 NumFractional 隐藏了运算符,并定义了名称相同但类型不同的运算符。这些运算符不适用于未修饰的数字类型。

所以与

{-# LANGUAGE NoMonomorphismRestriction #-}
import Numeric.Units.Dimensional.TF.Prelude
import qualified Prelude as P

你不能只写
fourpi = 4 * pi

由于 (*) :: Num a => Dimensional v d a -> Dimensional v d' a -> Dimensional v (Mul d d') a 然后,并且没有 Num 类型的 Dimensional 实例(不可能有,因为二维类型的乘积通常具有不同的维度),因此 4pi 不能解释为维度类型的值。

但是,您可以写
fourpi = 4 P.* P.pi

等,来自 Num 的运算符的合格版本仍然可用。

关于haskell - Dimension-tf : creating ordinary Int, Double 等值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15869398/

10-12 01:58