Haskell 如何编写这些函数以独立于类型选择:Int vs Integer
我正在研究,很多问题都涉及类似的函数,例如计算素数列表。我知道整数的计算速度比Int慢,所以我想根据我处理的数字的大小,编写两个函数Haskell 如何编写这些函数以独立于类型选择:Int vs Integer,haskell,types,integer,Haskell,Types,Integer,我正在研究,很多问题都涉及类似的函数,例如计算素数列表。我知道整数的计算速度比Int慢,所以我想根据我处理的数字的大小,编写两个函数 module Primes ( isPrime ,prime ,allPrimes ) where import Data.List isPrime :: Int -> Bool isPrime n | n == 0 = False | n == 1 = False | n < 0 = isPrim
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)
模素数
(
互质
首要的
,所有素数
)
哪里
导入数据。列表
iPrime::Int->Bool
isPrime n
|n==0=False
|n==1=False
|n<0=isPrime(-n)
|n<4=真
|n`mod`2==0=False
|n`mod`3==0=False
|任何(==0.mod n)[5..h]=False
|否则=真
哪里
h=(天花板.sqrt.fromIntegral)n
所有素数::[Int]
所有素数=[x | x Int
素数n=所有素数!!(n-1)
我知道这段代码通常不是最理想的。我只是对如何使整数类型更通用感兴趣。尝试
Integral
它应该同时支持Int
和Integral这是一种更通用的解决此类问题的方法,您可以尝试在不使用ex的情况下编译代码plicit类型声明。Haskell将采用最通用的类型,您可以通过在GHCi上加载文件并执行:t myFunctionName
听起来不错。我无法粘贴实际代码而不丢失所有格式,但我将签名替换为:isPrime::(整数n)=>n->Bool allPrimes::(Integral n)=>[n]prime::(Integral n,Integral m)=>n->m,我得到一个错误:“Primes.hs:29:24:无法将预期类型Int'与推断类型匹配
n'n'是一个刚性类型变量,由Primes处的
prime'的类型签名绑定。hs:28:19”@Peter Hall the(!!)
函数接受一个Int
参数。prime应该有类型Integral n=>Int->n
。我在(如果你感兴趣的话)上发布了一篇关于isPrime
的简短代码评论(重点是保留这里给出的精确算法)。