2016-12-02 46 views
2

我有此代碼濾波器掛在無限列表

isPrime x = x > 0 && filter divisible [1..x] == [1,x] 
where divisible y = x `mod` y == 0 

primes = filter isPrime [1..] 

限定素數的無限列表。

所有這些情況下按預期工作:

*Main> take 10 primes 
[2,3,5,7,11,13,17,19,23,29] 

*Main> take 10 $ filter odd primes 
[3,5,7,11,13,17,19,23,29,31] 

然而

*Main> take 10 $ filter even primes 
[2 

掛起並不會繼續。我不知道爲什麼... 我重新啓動ghci,問題依然存在。 我正在使用ghc 8.0.1。

我的包:

C:\projects\littlethings\prime>ghc-pkg list 
C:/Program Files/Haskell Platform/8.0.1\lib\package.conf.d 
    Cabal-1.24.0.0 
    GLURaw-2.0.0.1 
    GLUT-2.7.0.7 
    HTTP-4000.3.3 
    HUnit-1.3.1.1 
    ObjectName-1.1.0.1 
    OpenGL-3.0.0.2 
    OpenGLRaw-3.1.0.0 
    QuickCheck-2.8.2 
    StateVar-1.1.0.4 
    Win32-2.3.1.1 
    array-0.5.1.1 
    async-2.1.0 
    attoparsec-0.13.0.2 
    base-4.9.0.0 
    binary-0.8.3.0 
    bytestring-0.10.8.1 
    case-insensitive-1.2.0.6 
    containers-0.5.7.1 
    deepseq-1.4.2.0 
    directory-1.2.6.2 
    fgl-5.5.2.3 
    filepath-1.4.1.0 
    fixed-0.2.1.1 
    (ghc-8.0.1) 
    ghc-boot-8.0.1 
    ghc-boot-th-8.0.1 
    ghc-prim-0.5.0.0 
    ghci-8.0.1 
    half-0.2.2.3 
    hashable-1.2.4.0 
    haskeline-0.7.2.3 
    haskell-src-1.0.2.0 
    hoopl-3.10.2.1 
    hpc-0.6.0.3 
    hscolour-1.24 
    html-1.0.1.2 
    integer-gmp-1.0.0.1 
    mtl-2.2.1 
    network-2.6.2.1 
    network-uri-2.6.1.0 
    parallel-3.2.1.0 
    parsec-3.1.9 
    pretty-1.1.3.3 
    primitive-0.6.1.0 
    process-1.4.2.0 
    random-1.1 
    regex-base-0.93.2 
    regex-compat-0.95.1 
    regex-posix-0.95.2 
    rts-1.0 
    scientific-0.3.4.6 
    split-0.2.3 
    stm-2.4.4.1 
    syb-0.6 
    template-haskell-2.11.0.0 
    text-1.2.2.1 
    tf-random-0.5 
    time-1.6.0.1 
    transformers-0.5.2.0 
    unordered-containers-0.2.7.0 
    vector-0.11.0.0 
    xhtml-3000.2.1 
    zlib-0.6.1.1 

C:\Users\Hamburger\AppData\Roaming\ghc\x86_64-mingw32-8.0.1\package.conf.d 
    (containers-0.5.8.1) 
    data-ordlist-0.4.7.0 
    lazyset-0.1.0.0 
    memoize-0.8.1 

回答

10

只有2個是素數,偶數。其他素數不均勻。 filter不聰明。它試圖找到下一個偶數素數,雖然它不存在。這就是爲什麼你掛了。

如果您想要終止,您必須瞭解一般情況下無法解決問題(halting problem)。但無論如何,你可以寫近似。

例如,這是非常簡單的近似:

funnyFilter p = go ntriesMax 
    where 
    go _ (x:xs) | p x = x : go ntriesMax xs 
    go _  []  = [] 
    go 0  _  = [] 
    go n (_:xs)  = go (n - 1) xs 
    ntriesMax = 10000 
+0

哎呀。當然是。看起來像是我自己的溼件中的一個錯誤。 – KarlsFriend