Как мне написать эти функции, чтобы они не зависели от выбора типа: Int vs Integer

Я работаю с 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)

Я знаю, что этот код обычно не так оптимален, как мог бы быть. Меня просто интересует, как сделать целочисленные типы более общими.

5
задан iCodez 22 January 2015 в 20:03
поделиться