Я работаю через Project Euler , и многие проблемы связаны с похожими функциями, например, вычислением списков простых чисел.Я знаю, что вычисления с Integer медленнее, чем Int, поэтому я хотел бы написать функции для работы с обоими, в зависимости от размера чисел, с которыми я работаю.
module Primes
(
isPrime
,prime
,allPrimes
)
where
import Data.List
isPrime :: Int -> Bool
isPrime n
| n == 0 = False
| n == 1 = False
| n < 0 = isPrime (-n)
| n < 4 = True
| n `mod` 2 == 0 = False
| n `mod` 3 == 0 = False
| any ( (==0) . mod n ) [5..h] = False
| otherwise = True
where
h = ( ceiling . sqrt . fromIntegral ) n
allPrimes :: [Int]
allPrimes = [ x | x<- [2..], isPrime x ]
prime :: Int -> Int
prime n = allPrimes !! (n-1)
Я знаю, что этот код невообще не настолько оптимально, как могло бы быть.Меня просто интересует, как сделать целочисленные типы более общими.