如何转换(Num a)=> a在Haskell浮动?

时间:2016-07-18 14:15:26

标签: haskell

是否可以将以下两个函数组合成Haskell中的一个多态函数?

mutiplyByTwoI :: Int -> Float
mutiplyByTwoI x = fromIntegral x * 2.0

mutiplyByTwoF :: Float -> Float
mutiplyByTwoF x = x * 2.0

我尝试Num a,但我找不到将Num a转换为Float的方法。

mutiplyByTwo :: (Num a) => a -> Float
mutiplyByTwo = undefined

2 个答案:

答案 0 :(得分:9)

并非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

显然,没有办法将Complex转换为Float而不丢弃信息:Float生活在(实际线条的一部分)上,而复数则生活在复杂的飞机。没有适用于toFloat :: Num a => a -> Float的所有实例的函数Num

答案 1 :(得分:3)

你可以写

byTwo :: Real a => a -> Float
byTwo x = 2 * realToFrac x

可以专门针对您请求的两种类型Int -> FloatFloat -> Float