4

idris 0.9.17.1 では、

https://wiki.haskell.org/Prime_numbersからインスピレーションを得て、素数を生成する次のコードを作成しました

module Main

concat: List a -> Stream a -> Stream a
concat [] ys = ys
concat (x :: xs) ys = x :: (concat xs ys)

generate: (Num a, Ord a) => (start:a) -> (step:a) -> (max:a) -> List a
generate start step max = if (start < max) then start :: generate (start + step) step max else []

mutual
  sieve: Nat -> Stream Int -> Int -> Stream Int
  sieve k (p::ps) x = concat (start) (sieve (k + 1) ps (p * p)) where
    fs: List Int
    fs = take k (tail primes)
    start: List Int
    start = [n | n <- (generate (x + 2) 2 (p * p - 2)), (all (\i => (n `mod` i) /= 0) fs)]

 primes: Stream Int
 primes = 2 :: 3 :: sieve 0 (tail primes) 3


main:IO()
main = do     
  printLn $ take 10 primes

REPL で、私が書くtake 10 primesと、REPL は正しく表示されます[2, 3, 5, 11, 13, 17, 19, 29, 31, 37] : List Int

しかし、試し:execても何も起こらず、取得したプログラムをコンパイルして実行しようとすると、Segmentation fault: 11

誰かがこの問題をデバッグするのを手伝ってくれますか?

4

1 に答える 1

3

これを修正するために concat 関数を遅延させることができます。そのタイプをに変更するだけです

concat : List a -> Lazy (Stream a) -> Stream a

これでできます。

注: すべての素数を取得するには、generate 関数内の < を <= に変更します (現在、7 と 23 など一部が欠落しています)。

于 2015-06-25T18:49:53.297 に答える