Как я могу написать эти функции, чтобы быть независимым от выбора типа: Int против Integer - PullRequest
5 голосов
/ 05 сентября 2011

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

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

Ответы [ 2 ]

7 голосов
/ 05 сентября 2011

Более общее решение этой проблемы: вы можете попытаться заставить ваш код компилироваться без явных объявлений типов. Haskell примет наиболее общий возможный тип, и вы можете узнать, что это было, например, загрузив файл в GHCi и выполнив :t myFunctionName

7 голосов
/ 05 сентября 2011

Попробуйте Integral, это должно позволить поддержку Int и Integer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...