Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何编写这些函数以独立于类型选择:Int vs Integer_Haskell_Types_Integer - Fatal编程技术网

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

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

我正在研究,很多问题都涉及类似的函数,例如计算素数列表。我知道整数的计算速度比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)
模素数
(
互质
首要的
,所有素数
)
哪里
导入数据。列表
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
的简短代码评论(重点是保留这里给出的精确算法)。