6

ベキ級数をHaskellで書こうとしているのですが、

e^x = 1 + x + x^2/2! + x^3/3! + ...

それが出るように

[1,1,1/2,1/6,...]

これまでのところ、私は得ました:

factorial 0 = 1 
factorial n = n * factorial (n - 1)

powerSrs x = 1 : powerSrsFunc[1..] where
        powerSrsFunc ( p: xs ) = 
            p : powerSrsFunc[y | y <-xs, ( (x^y) / (factorial y) )]

ただし、ここでの入力が間違っていることは理解しています。このエラーが発生しています:

tut08.hs:8:58:
    No instance for (Integral Bool)
      arising from a use of `^'
    Possible fix: add an instance declaration for (Integral Bool)
    In the first argument of `(/)', namely `(x ^ y)'
    In the expression: ((x ^ y) / (factorial y))

    In a stmt of a list comprehension: ((x ^ y) / (factorial y))

tut08.hs:8:62:
    No instance for (Fractional Bool)
      arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Bool)
    In the expression: ((x ^ y) / (factorial y))
    In a stmt of a list comprehension: ((x ^ y) / (factorial y))
    In the first argument of `powerSrsFunc', namely
      `[y | y <- xs, ((x ^ y) / (factorial y))]'

1)「1/2」のように出力されるように、Haskell で分数をどのように記述しますか?

2) (Integral Bool) と (Fractional Bool) のインスタンスがないと言うとき、それはどういう意味ですか?

Integral 型と Bool 型の 2 つの引数を参照していますか?

インテグラルとインテグラルはかかりませんか?

4

2 に答える 2

9

リスト内包表記には、3 つの主要部分があります。コードを例に取る

[y | y <-xs, ( (x^y) / (factorial y) )]

左から順に、結果リストの各要素がどうあるべきかがわかります。あなたの場合、単に y. パイプ文字 (|) の後に、入力リストを反復処理する方法を指定して続行します。英語では「xs の各 y について」。

最後の部分であり、問​​題はフィルターです。リスト内包表記が現在の y を除外しないようにするために、すべてが真である必要がある条件のコンマ区切りリストを配置できます。条件 (真または偽) をそこに置く代わりに、結果が数値になる式をそこに置きます。ただし、実際には何もフィルタリングしたくないと思います。むしろ、その式の結果を出力したいと考えています。したがって、パイプ文字の左側にある必要があります。

[(x^y) / (factorial y) | y <-xs]

有理数の表示に関しては、Data.Ratio パッケージhttp://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.htmlをご覧ください。

于 2012-10-21T14:32:37.523 に答える
2

Haskell でベキ級数をさらに処理することに興味がある場合は、Douglas McIlroy (UNIX で有名) による優れた論文を参照してください: www.cs.dartmouth.edu/~doug/pearl.ps.gz

そこで彼はべき級数上の代数を定義しており、次のように入力してべき乗を定義できます。

expx = 1 + (integral expx)

また、関数の生成などの他のクールなものにも入ります。

于 2012-10-23T23:58:15.497 に答える