我想编写一个函数,它对 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
我应该怎么做才能让它工作?或者也许我从根本上错了,不应该这样做?这很奇怪,但我在互联网上没有找到任何关于此的内容。