【问题标题】:Why this code return empty list or fail? Haskell为什么此代码返回空列表或失败?哈斯克尔
【发布时间】:2013-05-13 22:40:53
【问题描述】:
primes :: [Int]
primes = sieve [2..]

sieve :: [Int] -> [Int]
sieve (p:xs)= p:sieve[x|x<-xs,x `mod` p /= 0]

f :: Int->Int
f n = head [x|x<-[0,(product (filter (<n) primes))..],x/=0,sum (map (x `mod`) [1..n]) == 0]

加载到 GHCi 并输入“f 20” 失败......请帮助我

【问题讨论】:

  • 选择您的代码并按 Ctrl-K 或 {} 按钮进行格式化。
  • 它是如何失败的? GHCi 是怎么说的?
  • 这应该是[2..n]吗? (map (x 'mod') [1..n])1
  • 使用takeWhile 而不是filter。但是由于您的列表是[Int],所以列表不是无限的,只是很长。 (并且使用可怕的算法,即使Int 是 32 位,也需要很长时间才能完成。)
  • @WillNess IntWordIntN/WordNEnum 实例在 maxBound 处停止,因此没有回绕(但最终在 sieve [] 处出现模式匹配失败)。我有点不耐烦,所以我的时间可能比你的要短;)

标签: haskell


【解决方案1】:

问题在于filter (&lt; n) primes。由于primes 是一个infinite 非常长的1 列表,这需要很长时间才能终止,因为它不知道(&lt; n) 最终会返回False所有素数都超过列表中的某个点,因此它必须不断检查整个列表。

> filter (< 20) primes
[2,3,5,7,11,13,17,19^CInterrupted.

请改用takeWhile (&lt; n) primes

> takeWhile (< 20) primes
[2,3,5,7,11,13,17,19]

1 由于[Int] 类型,它是有限的。如果是[Integer],那就是无限的了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多