Tôi đã viết hàm isPrime. Nó kiểm tra nếu một số đã cho là số nguyên tố hay không. Danh sách "nguyên tố" cuối cùng được cung cấp riêng.chức năng hợp nhất chậm hơn nhiều
prime :: [Integer]
prime = 2 : filter isPrime [3..]
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
isPrime n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ prime
Tôi nghĩ tốt hơn nên hợp nhất hai hàm thành một nếu có thể..để tôi củng cố isPrime và nhập thành một hàm isPrime2. Nhưng hiệu suất của isPrime2 rất tệ.
isPrime2 :: Integer -> Bool
isPrime2 n | n < 2 = False
isPrime2 n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ 2 : filter isPrime2 [3..]
isPrime 40000000000000000001
=> 0,5 giây
isPrime2 40000000000000000001
=> 19,8 giây
máy của tôi là Ubuntu 17.10 x86-64. Tôi đang sử dụng ghc 8.2.1. Có ai biết tại sao không?
Đoán của tôi là vì 'nguyên tố' là hằng số, nó được ghi nhớ, trong khi' isPrime2' là hàm, vì vậy nó không có. Đó chỉ là một dự đoán, tuy nhiên ... – MathematicalOrchid
Cảm ơn! Lời giải thích của bạn đã cho tôi những hiểu biết. – eii0000
@ eii0000 là bạn thử nghiệm nó biên soạn hoặc giải thích? nó so sánh như thế nào nếu bạn đơn giản hóa 'isPrime2 n' là' 'tất cả (\ p -> n' mod' p/= 0). takeWhile ((<= n). (^ 2)) $ 2: [3,5 ..] ''? –