2013-11-02 4 views
2

Я пытаюсь воссоздать факторную функцию, например fac 1 = 1, fac 2 = 2, fac 3 = 6, используя функции высокого порядка, но мне не очень повезло. Моя функция fold продолжает возвращать пустой список независимо от того, какие данные я им даю. Может кто-нибудь мне помочь?haskell: factorial using функция высокого порядка

Вот что я до сих пор:

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] 
Смежные вопросы