2012-10-21 23 views
5

我试图写在Haskell幂级数,电源系列在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)你如何在Haskell中写入分数,使得它输出像'1/2'?

2)是什么意思时,他们说的(积分布尔)和(分数布尔)没有实例?

它是指两个参数是类型的积分和布尔?

这岂不是拿积分和积分?

回答

9

在列表中理解语法,你有三个主要部分。以你的代码示例

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

从左边开始,你必须在结果列表中的每个元素应该是什么。在你的情况下,只需y。在管道字符(|)之后,您继续指定如何遍历输入列表。用英文表示“对于x中的每个y”。

最后一部分,你的问题,就是过滤器。您可以放置​​一个逗号分隔的条件列表,所有列表理解都需要为真,以避免过滤掉当前的y。不要在那里放置一个条件(某些是真或假的),而是在那里放置一个表达式来产生一个数字。不过,我假设你实际上不想过滤任何东西。相反,您想要输出该表达式的结果。所以它需要位于管道字符的左侧。

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

至于显示有理数,看看在Data.Ratio包http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.html

+0

我不能似乎得到的分数位运行的权利。看来Data.Ratio包中只有%操作符,它将显示比率为2%3而不是2/3。 – ali

+0

嗯,我想你可以把它变成一个字符串并用%替换%。我的猜测是,它使用%,以便它可以正确读入。使用/会与/的标准使用冲突。 –

+1

哦,男孩,现在我们将展开关于Int - > String对话的一系列新问题。哈哈。 – ali

1

如果你有兴趣,有能力系列做更多的哈斯克尔应该由道格拉斯·麦克罗伊签出巨大的纸(UNIX的名声):www.cs.dartmouth.edu/~doug/pearl.ps.gz

在那里,他定义了幂级数代数,它允许您通过键入定义幂:

expx = 1 + (integral expx) 

,并进入其他很酷的东西,如生成函数。

+0

你如何打开文件? – ali

+2

这里有一个pdf版本:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.9450 –