根据这本书,它是如何完成的,但我无法让它发挥作用。它给我一个错误不在范围内:'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
我想这也可以使用地图和过滤功能来完成?怎么样?
答案 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}}函数而言,只要考虑一个数字对于素数的意义...如果你已经正确计算了除数,你可以检查列表以确保它与该财产。
如果这个 是一个与家庭作业相关的问题,那么你一定要用作业来标记它,然后人们不会觉得胆小的帮忙:)