4

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

例如,此代码不输入检查(在 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.

4

1 回答 1

4

( dimensionaland dimensional-tf) 包隐藏了 and 中的运算符,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(不可能,因为二维类型的乘积通常具有不同的维度),因此4不能pi解释为维度类型的值。

但是,您可以编写

fourpi = 4 P.* P.pi

等等,Num仍然可以使用符合条件的操作符版本。

于 2013-04-08T00:42:27.047 回答