Haskell 铃号的实现
Haskell Implementation of Bell Numbers
我正在尝试在 Haskell 中实现铃号查找器 + 求和。我相当有信心我的方法是正确的,但我在编译时遇到了一些错误的问题。我当前的错误消息是:
[1 of 1] Compiling Main ( survey2.hs, survey2.o )
survey2.hs:5:14:**
Expected a constraint, but ‘Integer’ has kind ‘*’
In the type signature for ‘binomial’:
binomial :: (Integer, Integer) => Integer
survey2.hs:15:12:
Expected a constraint, but ‘Integer’ has kind ‘*’
In the type signature for ‘bellSum’: bellSum :: Integer => Integer**
我是 haskell 的新手,也是函数式语言的新手。基于此错误,我尝试更改我的 "function definitions"(或者您在 Haskell 中对它们的称呼),但我似乎导致了更多错误。
程序的最终目标是打印铃号 0-9 的总和。
factorial n
| n <= 1 = 1
| otherwise = n * factorial(n-1)
binomial :: (Integer, Integer) => Integer
binomial n k
| k > n = 0
| k < 0 = 0
| otherwise = factorial(n) / factorial(n-k) * factorial(k)
bell n
| n <= 1 = 1
| otherwise = sum [ binomial (n-1, k-1) * bell (k-1) | k<-[0..n-1] ]
bellSum :: Integer => Integer
bellSum n = sum [ bell(k) | k<-[0..n] ]
main = bell(9 :: Integer)
注意这是不一致的(=>
应该是->
)
binomial :: (Integer, Integer) -> Integer
binomial n k
要么更改为
binomial :: Integer -> Integer -> Integer
binomial n k
或
binomial :: (Integer, Integer) -> Integer
binomial (n, k)
给你的另一个提示,你可以在没有阶乘函数(甚至乘法)的情况下计算二项式
binomial n k | k==0 || k==n = 1
| k==1 = n
| otherwise = binomial (n-1) (k-1) + binomial (n-1) k
这仍然很低效,但可以记忆。
我正在尝试在 Haskell 中实现铃号查找器 + 求和。我相当有信心我的方法是正确的,但我在编译时遇到了一些错误的问题。我当前的错误消息是:
[1 of 1] Compiling Main ( survey2.hs, survey2.o )
survey2.hs:5:14:**
Expected a constraint, but ‘Integer’ has kind ‘*’
In the type signature for ‘binomial’:
binomial :: (Integer, Integer) => Integer
survey2.hs:15:12:
Expected a constraint, but ‘Integer’ has kind ‘*’
In the type signature for ‘bellSum’: bellSum :: Integer => Integer**
我是 haskell 的新手,也是函数式语言的新手。基于此错误,我尝试更改我的 "function definitions"(或者您在 Haskell 中对它们的称呼),但我似乎导致了更多错误。
程序的最终目标是打印铃号 0-9 的总和。
factorial n
| n <= 1 = 1
| otherwise = n * factorial(n-1)
binomial :: (Integer, Integer) => Integer
binomial n k
| k > n = 0
| k < 0 = 0
| otherwise = factorial(n) / factorial(n-k) * factorial(k)
bell n
| n <= 1 = 1
| otherwise = sum [ binomial (n-1, k-1) * bell (k-1) | k<-[0..n-1] ]
bellSum :: Integer => Integer
bellSum n = sum [ bell(k) | k<-[0..n] ]
main = bell(9 :: Integer)
注意这是不一致的(=>
应该是->
)
binomial :: (Integer, Integer) -> Integer
binomial n k
要么更改为
binomial :: Integer -> Integer -> Integer
binomial n k
或
binomial :: (Integer, Integer) -> Integer
binomial (n, k)
给你的另一个提示,你可以在没有阶乘函数(甚至乘法)的情况下计算二项式
binomial n k | k==0 || k==n = 1
| k==1 = n
| otherwise = binomial (n-1) (k-1) + binomial (n-1) k
这仍然很低效,但可以记忆。