我尝试通过使用高阶函数重新创建阶乘函数,例如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]
我尝试通过使用高阶函数重新创建阶乘函数,例如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]
fold
因为它的基本情况返回空列表返回空列表,以及递归步骤做任何事都要用递归的结果。显然,这些东西至少一个需要改变,而在这种情况下,这应该是基本情况:
fold f a [] = a
或者,你可以只使用foldl
本身,而不是试图重新实现它。
您可以生成所有因子值作为列表。
facts = scanl (*) 1 [1 ..]
之后得到一个值只是访问列表。
factN n = facts !! n + 1
λ> factN 6
720
配备折叠在一个列表,你可以实现它:
fact n = foldl1 (*) [1..n]
这个怎么样?
fac n=product [1..n]
您是否尝试过在几个样本上手动执行它? –
这个练习是否需要重新创建'foldl'? – jwodder