我有这段代码:
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
不起作用?
答案 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
不同,这不会检查列表的其余部分。