是否可以将以下两个函数组合成Haskell中的一个多态函数?
mutiplyByTwoI :: Int -> Float
mutiplyByTwoI x = fromIntegral x * 2.0
mutiplyByTwoF :: Float -> Float
mutiplyByTwoF x = x * 2.0
Run Code Online (Sandbox Code Playgroud)
我试过Num a
,但我找不到转换Num a
为Float的方法.
mutiplyByTwo :: (Num a) => a -> Float
mutiplyByTwo = undefined
Run Code Online (Sandbox Code Playgroud)
并非每个实例Num
都有明智的转换Float
.对于一个简单的(哈哈)示例,考虑复数:
-- represented in rectangular coordinates
data Complex = Complex { real :: Float, imaginary :: Float } deriving (Eq, Ord, Show, Read)
instance Num Complex where
Complex u v + Complex x y = Complex (u + x) (v + y)
Complex u v * Complex x y = Complex (u * x - v * y) (v * x + u * y)
negate (Complex u v) = Complex (negate u) (negate v)
-- etc
Run Code Online (Sandbox Code Playgroud)
很明显,没有办法将a转换Complex
为a Float
而不丢弃信息:Float
s生活在真实线的(子集)上,而复数则生活在复杂的平面上.没有toFloat :: Num a => a -> Float
适用于所有实例的函数Num
.