我有以下代码(与Project Euler的问题34有关):
fac :: Int -> Int
fac = foldr1 (*) . enumFromTo 1
fe :: Int -> Bool
fe = (==) =<< (sum . map fac . digits 10)
fes :: [Int]
fes = filter fe [3..]
fac
工作正常,fe
工作正常,但fes
给出了:
*** Exception: Prelude.foldr1: empty list
有趣的是,如果我用145开始列表(fe
在这里返回True),它适用于该数字,然后引发异常。
为什么这段代码失败了?它似乎是一个完全正常的filter
应用程序,它具有明显有效的函数和一个单独使用该函数的常规数字列表。
答案 0 :(得分:6)
您的fac
因数字0
而失败,其列表为空。你可以尝试
fac = foldr (*) 1 . enumFromTo 1
顺便说一下foldl'
(来自Data.List
)可能比foldr
更好,而且还有一个预定义的product
函数。