我试图通过创建一些基本功能来学习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]
感谢任何帮助。提前谢谢。
答案 0 :(得分:1)
您可以使用&#34;过滤器&#34;功能。它有这种类型:
filter :: (a -> Bool) -> [a] -> [a]
第一个参数是谓词,第二个参数是您要过滤的列表。结果是一个列表,其中仅包含谓词返回True的元素。因此,您可以编写以下任何内容:
primeFactors n = filter isPrime (factors n)
primeFactors n = filter isPrime $ factors n
primeFactors = filter isPrime . factors
第一个应该是自我解释的。第二个使用&#34; $&#34;运算符,它只是具有零优先级的函数应用程序。它通常用于删除尾随表达式中的括号。最后一个是在#34;无点&#34; style(术语来自拓扑:粗略地说一个点是一个变量)。 &#34;。&#34;运算符定义如下:
(f . g) x = f (g x)
如果你替换&#34;过滤isPrime&#34;为&#34; f&#34;和&#34;因素&#34;为&#34; g&#34;你会看到它是如何运作的。