如何编写这些函数以独立于类型选择:Int vs Integer

Pet*_*all 5 haskell types 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)
Run Code Online (Sandbox Code Playgroud)

我知道这段代码通常不是最佳的.我只是对如何使整数类型更通用感兴趣.

Jos*_*ers 7

尝试Integral它应该允许支持IntInteger

  • @Peter Hall`(!!)`函数采用`Int`参数.prime应该具有类型`Integral n => Int - > n`. (2认同)

hug*_*omg 7

对于这类问题的更通用的解决方案,您可以尝试在没有显式类型声明的情况下编译代码.Haskell将采用最通用的类​​型,您可以找到它的内容,例如,在GHCi上加载文件并执行:t myFunctionName