我正在尝试通过使用高阶函数来重建一个阶乘函数,例如fac 1 = 1,fac 2 = 2,fac 3 = 6,但我没有太多运气。无论我给出什么输入,我的fold函数都会返回空列表。任何人都可以帮助我吗?
这是我到目前为止所拥有的:
fold f a [] = []
fold f a (x:xs) = fold f (f a x) xs
fac n = fold (*) 1 [1..n]
答案 0 :(得分:2)
fold
返回空列表,因为它的基本情况返回空列表,递归步骤永远不会对递归结果做任何事情。显然,这些事情中至少有一个需要改变,在这种情况下,这应该是基本情况:
fold f a [] = a
或者,您可以使用foldl
本身,而不是尝试重新实现它。
答案 1 :(得分:0)
您将所有因子值生成为列表。
facts = scanl (*) 1 [1 ..]
之后获取一个值只是访问列表。
factN n = facts !! n + 1
λ> factN 6
720
答案 2 :(得分:0)
通过折叠列表,您可以实现它:
fact n = foldl1 (*) [1..n]
答案 3 :(得分:0)
这个怎么样?
fac n=product [1..n]