使用 dimensional-tf
包时,是否可以在不使用 Num
单元的情况下使用“普通” Int
实例(即 Double
、 Integer
、 one
)?
例如,此代码不键入检查(在 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
)包对 Num
和 Fractional
隐藏了运算符,并定义了名称相同但类型不同的运算符。这些运算符不适用于未修饰的数字类型。
所以与
{-# 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
的运算符的合格版本仍然可用。关于haskell - Dimension-tf : creating ordinary Int, Double 等值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15869398/