我有一个多项式方程的常数和度数列表,并希望返回一个组合的列表,以便应用一个值,然后求和。但是这个列表是Int,我的函数需要一个double的列表。
poly :: [Double] -> [Double] -> [Double -> Double]
poly a b =
let f x y = (*x) . (**y)
in uncurry f <$> zip a b
-- does not work
poly ([1,2,3]:: [Double]) ([1,2,3]:: [Double])
如何将int列表转换为double列表?
答案 0 :(得分:5)
您可以使用fromIntegral
,它将从任何Integral类型转换为任何数字类型(Int,Integer,Rational和Double)。
答案 1 :(得分:0)
在@ 4castle和Victoria Ruiz的帮助下,我提出了以下建议:
poly :: [Int] -> [Int] -> [Double -> Double]
poly = zipWith $ \x y -> (* (fromIntegral x)) . (** (fromIntegral y))
apply :: Double -> [Double -> Double] -> Double
apply x b = sum $ ($x) <$> b
-- l=left limiting, r=right limiting, a=coeficients, b=degrees
solve :: Int -> Int -> [Int] -> [Int] -> [Double]
solve l r a b =
let h = 0.001
linspace = [fromIntegral l,fromIntegral l+h..fromIntegral r]
p = poly a b
area = sum $ map ((*h) . (`apply` p)) linspace
volume = h * (sum $ map ((*pi) . (**2) .(`apply` p)) linspace)
in [area,volume]
我认为Haskell编译器的强类型推理具有一些不能通过类型转换直接解决的特性。