我正在尝试在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)当他们说(Integral Bool)和(Fractional Bool)没有实例时,这是什么意思?
它是指两个类型为Integral和Bool的参数吗?
不采用积分和积分吗?
答案 0 :(得分:9)
在列表理解语法中,您有三个主要部分。以您的代码为例
[y | y <-xs, ( (x^y) / (factorial y) )]
从左边开始,你得到结果列表中每个元素应该是什么。在你的情况下,简单地说。在管道字符(|)之后,您继续指定如何迭代输入列表。用英语“for x in ys”。
最后一部分和您的问题是过滤器。您可以将逗号分隔的条件列表放在列表推导中,而不是过滤掉当前的y。而不是在那里放置一个条件(某些事情是真或假),你在那里放一个表达式,产生一个数字。但是,我认为你实际上并不想过滤任何东西。相反,您想要输出该表达式的结果。所以它需要在管道字符的左边。
[(x^y) / (factorial y) | y <-xs]
至于显示有理数字,请查看Data.Ratio包http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Ratio.html
答案 1 :(得分:2)
如果你有兴趣在Haskell中使用power系列做更多的事情,你应该看看Douglas McIlroy(UNIX成名)的一篇好文章:www.cs.dartmouth.edu/~doug/pearl.ps.gz
在那里他定义了幂函数的代数,它允许你通过输入来定义取幂:
expx = 1 + (integral expx)
并且还涉及其他很酷的东西,比如生成函数。