Haskell - 求整数的除数

时间:2012-01-02 13:53:00

标签: list haskell integer

根据这本书,它是如何完成的,但我无法让它发挥作用。它给我一个错误不在范围内:'ld'。我猜我应该导入一些包但不确定哪一个。本书也在提示时使用GS模块,但我使用的是带有Prelude的WinGHCi。我在这里缺少什么?

factors :: Int -> [Int]
factors n | n < 1 = error "not positive"
          | n == 1 = []
          | otherwise = p : factors (div n p)
                        where p = ld n

我想这也可以使用地图和过滤功能来完成?怎么样?

3 个答案:

答案 0 :(得分:6)

我认为作业的目的是教你列表推导,filter和类似的结构,而不是让你编写测试素数的函数或以任何合理的方式创建除数列表。因此,您需要的是谓词divides

divides :: Int -> Int -> Bool
a `divides` b = ???

然后将该谓词用于filter的参数或列表推导中以查找除数列表,并使用divisors函数进行isPrime测试。

答案 1 :(得分:5)

您想要检查从1到n的所有数字,并且只有在它们除以n时才保留它们。 filter功能可以帮助您:

divisors n = filter ??? [1..n]

那么你需要用什么条件来代替???

对于isPrime函数,您可以重复使用divisors函数,您已经提到过。

答案 2 :(得分:3)

将其分解为更简单的步骤。

编写一个函数divides :: Int -> Int -> Bool,使其

x `divides` n
当x是n的除数时,

为真。首先,请考虑x成为n的除数意味着什么。

现在您可以检查单个号码x是否为n的除数,您需要检查小于n的某个数字范围,以查看哪些数字n是除数。

提示:在Haskell中,您可以生成从1到[1..n]的数字列表,如下所示:filter

这是您提到的filter :: (a -> Bool) -> [a] -> [a] 函数有用的地方。检查其类型:

a

只需将上面的Int替换为isPrime即可。

就{{1}}函数而言,只要考虑一个数字对于素数的意义...如果你已经正确计算了除数,你可以检查列表以确保它与该财产。

如果这个 是一个与家庭作业相关的问题,那么你一定要用作业来标记它,然后人们不会觉得胆小的帮忙:)