2013-11-02 147 views
2

我尝试通过使用高阶函数重新创建阶乘函数,例如fac 1 = 1,fac 2 = 2,fac 3 = 6,但我没有太多运气。无论我给它什么输入,我的折叠函数都会返回空列表。谁能帮我吗?haskell:使用高阶函数的阶乘

这是我到目前为止有:

fold f a [] = [] 
fold f a (x:xs) = fold f (f a x) xs 


fac n = fold (*) 1 [1..n] 
+0

您是否尝试过在几个样本上手动执行它? –

+0

这个练习是否需要重新创建'foldl'? – jwodder

回答

2

fold因为它的基本情况返回空列表返回空列表,以及递归步骤做任何事都要用递归的结果。显然,这些东西至少一个需要改变,而在这种情况下,这应该是基本情况:

fold f a [] = a 

或者,你可以只使用foldl本身,而不是试图重新实现它。

0

您可以生成所有因子值作为列表。

facts = scanl (*) 1 [1 ..] 

之后得到一个值只是访问列表。

factN n = facts !! n + 1 

λ> factN 6 
720 
0

配备折叠在一个列表,你可以实现它:

fact n = foldl1 (*) [1..n] 
0

这个怎么样?

fac n=product [1..n]