为什么这个Haskell代码失败了?

时间:2015-10-13 23:05:45

标签: haskell

我有以下代码(与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应用程序,它具有明显有效的函数和一个单独使用该函数的常规数字列表。

1 个答案:

答案 0 :(得分:6)

您的fac因数字0而失败,其列表为空。你可以尝试

fac = foldr (*) 1 . enumFromTo 1

顺便说一下foldl'(来自Data.List)可能比foldr更好,而且还有一个预定义的product函数。