2016-12-02 10 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

なんてこった:

例えば、それは非常に単純な近似値です。はい、もちろん。私自身のwetwareの欠陥のように見える。 – KarlsFriend

関連する問題