1

整数 `x を指定してe x (最初の 10 項) を計算する関数を作成しようとしています。

e xの級数展開は次の式で与えられます。

1 + x + x2/2! + x3/3! + x4/4! + ....

関数自体はかなり簡単に記述できましたが、除算に関する Haskell 型のルールを理解できないようです。つまり、整数をより大きな整数で除算して浮動小数点の結果を取得したいのです。

これが私が現在持っているものです

_eToX :: (Fractional a, Integral a) => a -> a -> a
_eToX x 0 = 1.0
_eToX x 1 = x
_eToX x n = ( fromIntegral(x^n) / fromIntegral(factorial n) ) + _eToX x (n - 1)

ここで上で行っていることは、2 つの整数結果 (x^nおよび) を計算してから、およびfactorial nを使用して浮動小数点コンテキストで評価するという意味です。ただし、この関数は次のエラーを返します。fromIntegral/

    1. Could not deduce (a ~ Integer)
    from the context (Fractional a, Integral a)
      bound by the type signature for
                 _eToX :: (Fractional a, Integral a) => a -> a -> a
      at /run-r4AWbVU9Fyph0OVhK3Dm/solution.hs:9:10-50
      `a' is a rigid type variable bound by
          the type signature for
            _eToX :: (Fractional a, Integral a) => a -> a -> a
          at /run-r4AWbVU9Fyph0OVhK3Dm/solution.hs:9:10
    In the return type of a call of `factorial'
    In the second argument of `(/)', namely `factorial n'
    In the first argument of `(+)', namely `(x ^ n / factorial n)'

    2. No instance for (Integral Double) arising from a use of `f'
    Possible fix: add an instance declaration for (Integral Double)
    In the expression: f
    In the second argument of `($)', namely
      `f $ map (read :: String -> Double) $ lines inputdata'
    In the second argument of `($)', namely
      `map show $ f $ map (read :: String -> Double) $ lines inputdata'

このメイン関数で関数を実行しています:

main = do
   n <- readLn :: IO Int -- n doesnt really matter here because of getContents
   inputdata <- getContents
   mapM_ putStrLn $ map show $ f $ map (read :: String -> Double) $ lines inputdata
4

3 に答える 3

4

このタイプ:

_eToX :: (Fractional a, Integral a) => a -> a -> a

意味がありません。最初の引数と結果を にするFractional必要がありますが、シーケンスの位置に対応する 2 番目の引数は にする必要がありますIntegral。タイプを次のように変更します。

_eToX :: (Fractional a, Integral b) => a -> b -> a

Integralが原因でインスタンスが欠落しているために、別のエラーが発生していますfromIntegral (x^n)。ghciショー

Prelude> :t (^)
(^) :: (Integral b, Num a) => a -> b -> a

fromIntegral出力はすでに正しいタイプであるため、ここで使用する必要さえありません。最終的な機能は次のとおりです。

_eToX :: (Fractional a, Integral b) => a -> b -> a
_eToX x 0 = 1.0
_eToX x 1 = x
_eToX x n = ( (x^n) / fromIntegral(factorial n) ) + _eToX x (n - 1)
于 2013-10-07T21:45:49.257 に答える
0

これがおそらくあなたが探しているものです。

eToX :: Integral a => Double -> a -> Double
eToX x 0 = 1
eToX x 1 = 1 + x
eToX x n = x^^n / (fromIntegral $ factorial n) + eToX x ( n - 1)

(^^) :: (Fractional a, Integral b) => a -> b -> a

あなたは望んでおらず、同じになりたくnありませんでしxた。その累乗関数がどのようにそれを行うかを見てください。

ああ、あなたの方程式は間違っていましたn = 11 + x

于 2013-10-07T21:45:12.613 に答える
0

あなたfの与えられた_eToXですか?_eToX は 2 つの引数を取りますが、f を 1 つだけに適用します。部分的なアプリケーションのみが必要な場合は、これで問題ありません。

エラー メッセージに関しては、次の点を確認する必要があります。

あなたの階乗のタイプは何ですか?結果として整数を持つものであり、Typclassesを実装するものではないようIntegralですfractional

読み取り関数に型注釈を追加しました。stDoubleのインスタンスではない を返しますIntegral。しかし、あなたfは のインスタンスである何かを引数として取っているようですIntegral

于 2013-10-07T21:46:26.590 に答える