2016-11-15 77 views
0

试图实现列出某些数字范围内的所有素数的函数,我知道在检查因素时我不必检查该数字的sqrt以外的因素。sqrt和floor的组合模糊变量

factors n = [x | x <- [1..(floor (sqrt n))], mod n x == 0] 
prime n = factors n == [1,n] 
listPrimesFromTill n z = [ xs | xs <- [n..z], prime xs == True] 

我已经浏览了答案,我尝试了各种方法,如利用类型

factors :: (RealFrac b, Integral c, Floating b) => b -> c 

检查,但有没有运气。

任何帮助表示赞赏!

+2

是否有意义使用'Floating'作为'factors'输入约束?这意味着称为“因素3.14”是有效的。输出应该是什么? – crockeea

回答

1

看起来你看着你写的代码,并计算出后的类型。一般来说,Haskell开发是相反的:首先找出类型,然后实现函数。 factors应该有什么类型?试图编译代码,我们得到以下错误,当

factor :: Integral a => a -> [a] 

现在:

Could not deduce (Floating a) arising from a use of `sqrt` from the context (Integral a) 

Could not deduce (RealFrac a) arising from a use of `sqrt` from the context (Integral a) 
嗯,你只能比化整数,所以什么类型的,所以这似乎是明智的

它抱怨说您指定了Integral a,但它需要Floating asqrt。我们可以通过usinf fromIntegral做到这一点:

sqrt   ::   Floating a => a -> a 
fromIntegral :: (Integral a, Num b) => a -> b 

factors :: Integral a => a -> [a]  vvvvvvvvvvvvvv 
factors n = [x | x <- [1..(floor (sqrt (fromIntegral n)))], mod n x == 0] 

为了保持可读性,

factors n = [x | x <- [1..isqrt n], mod n x == 0] 
    where isqrt = floor . sqrt . fromIntegral 
+0

这对我不起作用,它不适用于任何东西! –

+0

@FredPark请更具体。什么不工作? – ThreeFx

+0

修改你的建议(这是有道理的)的代码没有找到我想要的范围内的素数。 –