カーブの下の面積を計算する短い関数を書こうとしていますが、タイプミスマッチエラーが続いています。Haskell浮動小数点計算エラー
l
,r
は評価の範囲であり、a
およびb
はカーブのパラメータです。
solve :: Int -> Int -> [Int] -> [Int] -> [Double]
solve l r a b = [area]
where eval a b p = fromIntegral . sum . map (\(ai, bi) -> ai * p^bi) $ zip a b
area = foldl (\acc p -> acc + 0.001 * eval a b p) 0 range
range = map (\a -> (fromIntegral a :: Double)/1000) [l*1000..r*1000]
ハスケルのタイプシステムが本当に直感的ではないので、私はかなり不満を感じています。数値計算で浮動小数点数を扱う際にベストプラクティスを提案する人はいますか?要約する
ため、上記のコードが機能しない:型宣言a
で
- が
[Int]
- として宣言され、したがってHaskellは
(*)
が持っているのでeval
も、Int
型を持つと推察署名Num a => a -> a -> a
(同じタイプのパラメータのみをとるように)
入力タイプを変更せずにこの問題の代数曲線を浮動小数点値に評価する場合は、a
を[Double]
にキャストするだけです。ここでは、コードです:
solve :: Int -> Int -> [Int] -> [Int] -> [Double]
solve l r a b = [area]
where eval p = sum . map (\(ai, bi) -> ai * p ^^ bi) $ zip af b
area = foldl (\acc p -> acc + 0.001 * eval p) 0 range
range = map (\x -> (fromIntegral x :: Double)/1000) [l*1000..r*1000]
af = map fromIntegral a :: [Double]
私も負の指数に対処する^^
に^
を変更しました。