Haskell 具有双精度和泛型数的操作

Haskell 具有双精度和泛型数的操作,haskell,numbers,polymorphism,double,Haskell,Numbers,Polymorphism,Double,我想写一个函数,它对double和任何其他类型的支持乘法和加法的数字进行运算,结果得到double。 当然,以下代码不会编译,因为(*)的类型是t->t->t,所以不允许混合使用不同的类型: f :: (Num a) => Double -> a -> a -> Double f x a b = a*x + b 我想要的是能够写出这样的东西: f :: ... f x a b = ... -- equivalent to a*x + b f 1.0 (2 :: Int

我想写一个函数,它对double和任何其他类型的支持乘法和加法的数字进行运算,结果得到double。 当然,以下代码不会编译,因为(*)的类型是t->t->t,所以不允许混合使用不同的类型:

f :: (Num a) => Double -> a -> a -> Double
f x a b = a*x + b
我想要的是能够写出这样的东西:

f :: ...
f x a b = ... -- equivalent to a*x + b

f 1.0 (2 :: Int)    (3 :: Int)    -- returns 5.0
f 1.0 (2 :: Word32) (3 :: Word32) -- returns 5.0
f 1.0 (2 :: Float)  (3 :: Float)  -- returns 5.0
我该怎么做才能让它工作?或者我根本错了,不应该这样做?这很奇怪,但我在互联网上找不到任何与此相关的信息。

中有一段很好的关于在一些数字类型之间转换数字的内容(表6.4)

似乎可行

> f 1.0 (2 :: Int)    (3 :: Int)
5.0
it :: Double
> f 1.0 (2 :: Word32) (3 :: Word32)
5.0
it :: Double
> f 1.0 (2 :: Float)  (3 :: Float)
5.0
it :: Double
中有一段很好的关于在一些数字类型之间转换数字的内容(表6.4)

似乎可行

> f 1.0 (2 :: Int)    (3 :: Int)
5.0
it :: Double
> f 1.0 (2 :: Word32) (3 :: Word32)
5.0
it :: Double
> f 1.0 (2 :: Float)  (3 :: Float)
5.0
it :: Double

使用TypeClass的机制进行“重载”:


另请参见。

使用TypeClass的机制进行“重载”:


另请参见。

f1.0((2:+3)::复数双精度)((7:+4)::复数双精度)--返回???
嗯,您是对的。我可能应该一直写(实数a)而不是(numa)。我忘记了
Num
Real
Floating
fractal
之间的区别…
f1.0((2:+3)::复数双精度)((7:+4)::复数双精度)--返回???
你说得对。我可能应该写(Real a)而不是(Num a)。我忘记了rational中
Num
Real
Floating
fractive
之间的区别。托邦式的可以说是它自己的惩罚。(见)谢谢,这很有帮助。我看到了这些函数,并试图使用它们,但显然,它们放错了地方。
fromRational。托邦式的
可以说是它自己的惩罚。(见)谢谢,这很有帮助。我看到了这些函数,并试图使用它们,但是,显然,在错误的地方。
import Data.Word
import GHC.Float

class F a where f :: Double -> a -> a -> Double
instance F Int where f x a b = fromIntegral a * x + fromIntegral b
instance F Word32 where f x a b = fromIntegral a * x + fromIntegral b
instance F Float where f x a b = float2Double a * x + float2Double b

tests =
  [ f 1.0 (2 :: Int) (3 :: Int)
  , f 1.0 (2 :: Word32) (3 :: Word32)
  , f 1.0 (2 :: Float) (3 :: Float)
  ]
-- > tests
-- [5.0,5.0,5.0]
-- > :t it
-- it :: [Double]