2016-03-04 52 views
1

我想通过创建一些基本函数来学习Haskell。我目前正在努力的功能叫做primeFactors,它需要返回给定数字n的素数因子列表。目前我有以下几种:Haskell函数返回n的主因子

factors :: Integral a => a -> [a] 
factors n = [x | x <- [1..n], n `mod` x == 0] 

isPrime :: Integral a => a -> Bool 
isPrime n = factors n == [1, n] 

primeFactors :: Integral a => a -> [a] 
primeFactors n = [] 

我想我应该使用前两个函数,但我并不确定如何去做。函数式编程对我来说是全新的。

在,如果我把它像这样结束:primeFactors 10我希望它返回[5, 2]

任何帮助表示赞赏。提前致谢。

+0

“因素”只需要考虑x < - [1 ..(n + 1)'div' 2]。想想看。 –

回答

1

您可以使用“过滤器”功能。它有这种类型:

filter :: (a -> Bool) -> [a] -> [a] 

第一个参数是谓词,第二个参数是您要过滤的列表。结果是一个只包含谓词返回True的元素的列表。所以你可以写下面的任何一条:

primeFactors n = filter isPrime (factors n) 

primeFactors n = filter isPrime $ factors n 

primeFactors = filter isPrime . factors 

第一个应该是自我解释。第二个使用“$”运算符,它只是具有零优先级的函数应用程序。它通常用于去除尾部表达式中的括号。最后一个是“无点”风格(这个术语来自拓扑结构:粗略地说,一个点是一个变量)。 “。”运营商的定义是这样的:

(f . g) x = f (g x) 

如果代替“过滤isPrime”为“F”和“因素”为“G”成,你会看到它是如何工作的。

+0

我最终做了以下,但你的方式更清洁: '''primeFactors n = [x | x < - [1..n],n'mod' x == 0 && isPrime x]''' –

+0

你能帮我解决这个问题吗? ''nextPrime :: Integral a => a - > a'' ''nextPrime n = n''它必须在n之后返回下一个素数 –

+0

您可以使用dropWhile:'nextPrime n = head。 dropWhile(<= n)$ filter isPrime [1 ..]'。在'$'后面,一个素数列表随时产生(懒惰评估:只计算需要的东西)。然后,我们过滤掉每个小于或等于'n'的值,因为你想要下一个素数。然后,我们把头,因为我们只需要1. – Renzeee