我在eulerproject中做问题21。
其中一部分要求找到数字的适当除数的列表。即存在n的剩余部分和少于n的一些数目。所以我做了这个Haskell,但是GHCI生气了我。

divisors n =[ n | n <- [1..(n-1)], n `rem` [1..(n-1)] ==0 ]

问题是我不知道该怎么做:
n `rem` [1..(n-1)]

因此,它仅返回小于n且均分为n的数字。

最佳答案

您只需要一个单独的变量。

Prelude> let divisors n = [x | x <- [1..(n-1)], n `rem` x == 0]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]

现在,如果您想提高效率,我们已经知道除数不会超过n的一半,而且我们知道1是所有内容的除数。并且,让我们继续进行操作,使其更加Haskell-y,从而避免了列表理解:
Prelude> let divisors n = 1 : filter ((==0) . rem n) [2 .. n `div` 2]
Prelude> divisors 20
[1,2,4,5,10]
Prelude> divisors 30
[1,2,3,5,6,10,15]
Prelude> divisors 31
[1]

09-16 01:34