Haskell高效计划

时间:2018-02-14 17:28:46

标签: haskell

我有这段代码:

trimorficos :: [Integer]
trimorficos = filter (trim) [0..]

trim :: Integer -> Bool
trim x = (show x) `isSuffixOf` (show (x^3))
      where a = show x
            b = show (x^3)

densityTrimorficos :: Integer -> Double
densityTrimorficos n = fromInteger (n - (genericLength (filter (<=10) trimorficos))) / fromInteger n

为什么上一个函数densityTrimorficos不起作用?

1 个答案:

答案 0 :(得分:1)

trimorficos是一个无限的列表。

filter (<=10) trimorficos永远不会在最后生成列表末尾[]。为此,它应该验证,从某一点开始,trimorficos仅包含数字> 10,但这需要无限时间。 基本上,filter会返回类似a:b:c:nonTerminating而不是a:b:c:[] = [a,b,c]的内容。

因此,genericLength无法终止,因为它会尝试将nonTerminating评估为d:...[],但这需要无限时间。

正如上面评论中所指出的,您可能需要takeWhile (<=10) trimorficos代替,一旦遇到第一个&gt; 10号码,就会产生[]。请注意,与filter不同,这不会检查列表的其余部分。