是否可以将以下两个函数组合成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
答案 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 -> Float
和Float -> Float
。