从输入

时间:2018-06-17 01:39:44

标签: haskell

我有一个多项式方程的常数和度数列表,并希望返回一个组合的列表,以便应用一个值,然后求和。但是这个列表是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列表?

2 个答案:

答案 0 :(得分:5)

您可以使用fromIntegral,它将从任何Integral类型转换为任何数字类型(Int,Integer,Rational和Double)。

更多信息:https://wiki.haskell.org/Converting_numbers

答案 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编译器的强类型推理具有一些不能通过类型转换直接解决的特性。