【问题标题】:Haskell function that returns prime factors of n返回 n 的素数的 Haskell 函数
【发布时间】:2016-03-05 03:58:30
【问题描述】:

我正在尝试通过创建一些基本函数来学习 Haskell。我目前正在尝试处理的函数称为primeFactors,它需要返回给定数字 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]

感谢任何帮助。提前致谢。

【问题讨论】:

  • "factors" 只需要考虑 x div 2]。想想吧。

标签: haskell factors


【解决方案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)

如果您将“filter isPrime”替换为“f”,将“factors”替换为“g”,您将看到它是如何工作的。

【讨论】:

  • 我最终做了以下,但你的方式更干净:primeFactors n = [x | x &lt;- [1..n], n `mod` x == 0 &amp;&amp; isPrime x]
  • 你能帮我解决这个问题吗? nextPrime :: Integral a =&gt; a -&gt; anextPrime n = n它必须返回n之后的下一个素数
  • 你可以使用 dropWhile:nextPrime n = head . dropWhile (&lt;=n) $ filter isPrime [1..]。在$ 之后,会动态生成一个素数列表(惰性求值:只计算需要的)。然后,我们过滤掉每个小于或等于n 的值,因为你想要下一个素数。然后,我们拿头,因为我们只需要 1 个。
  • @RenZeee:这会起作用,但它仍然会计算所有素数。最好从“n”开始生成候选。
  • 好一个,然后:nextPrime n = head $ filter isPrime [n..] 如果也允许n
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
相关资源
最近更新 更多