Haskell的方法是为Complex Float
和Complex Int
设置不同的类型,而不是试图将它们统一为一种类型。随着类型类,你可以一次定义所有这些类型的:
data Complex a = C a a
instance Num a => Num (Complex a) where
(C x y) + (C u v) = C (x+u) (y+v)
(C x y) * (C u v) = C (x*u-y*v) (x*v+y*u)
fromInteger n = C (fromInteger n) 0
...
这一次定义Complex Int
,Complex Double
,Complex Rational
等。事实上它甚至定义Complex (Complex Int)
。
请注意,这并未定义如何将Complex Int
添加到Complex Double
。加法(+)仍然有(+) :: a -> a -> a
类型,因此只能将Complex Int
加到Complex Int
和Complex Double
加到另一个Complex Double
。
为了增加你必须明确地将它们转换不同类型的数字,例如:
addIntToComplex :: Int -> Complex Double -> Complex Double
addIntToComplex n z = z + fromIntegral n
看一看http://www.haskell.org/tutorial/numbers.html部分10.3 Haskell的数字类型类之间更有效的转化功能。
更新:
在回答您的意见,我建议更多的行动和更少的重点类型。
例如,考虑这样的定义:
onethird = 1/3
这代表了所有号码类通用的 “1/3” 值:
import Data.Ratio
main = do
putStrLn $ "as a Double: " ++ show (onethird :: Double)
putStrLn $ "as a Complex Double: " ++ show (onethird :: Complex Double)
putStrLn $ "as a Ratio Int: " ++ show (onethird :: Ratio Int)
putStrLn $ "as a Complex (Ratio Int): " ++ show (onethird :: Complex (Ratio Int))
...
在某种意义上Haskell中,让我们的 “用户” 决定什么样的数字表达式应该被评估为。
您如何期待能够将形式为'con2(Complex Float)'的'ComplexNum'添加到形式'con3(Complex Rational)'之一? –
@Tom通过自己提供这些函数(“促进”/转换类型等) - 数字包括我想要的所有数字表示形式,例如Int,Integer等,我将实例分数为Number,然后用'instance创建我自己的复杂类小数A =>小数(复数a)'。我希望有人会知道如何使用Data.Complex而不是我自己做到这一点。 – user3125280
@ user3125280为什么?这种对类型的知识和控制的丧失会增加你的收益? –