【发布时间】:2014-10-09 12:31:13
【问题描述】:
我正在解决 Haskell 中的 Project Euler 问题。我已经为下面的问题 3 找到了一个解决方案,我已经在小数上对其进行了测试,并且它可以工作,但是由于通过首先推导所有素数的蛮力实现,它对于较大的数字呈指数级增长。
-- Project Euler 3
module Main
where
import System.IO
import Data.List
main = do
hSetBuffering stdin LineBuffering
putStrLn "This program returns the prime factors of a given integer"
putStrLn "Please enter a number"
nums <- getPrimes
putStrLn "The prime factors are: "
print (sort nums)
getPrimes = do
userNum <- getLine
let n = read userNum :: Int
let xs = [2..n]
return $ getFactors n (primeGen xs)
--primeGen :: (Integral a) => [a] -> [a]
primeGen [] = []
primeGen (x:xs) =
if x >= 2
then x:primeGen (filter (\n->n`mod` x/=0) xs)
else 1:[2]
--getFactors
getFactors :: (Integral a) => a -> [a] -> [a]
getFactors n xs = [ x | x <- xs, n `mod` x == 0]
我查看了here 的解决方案,可以看到factor 中的第一个守卫如何优化它。我不明白的是:
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
特别是filter的第一个参数。
((==1) . length . primeFactors)
由于 primeFactors 本身就是一个函数,我不明白它在这种情况下是如何使用的。有人可以解释一下这里发生了什么吗?
【问题讨论】:
-
你只是难以理解
primes = 2 : filter ((==1) . length . primeFactors) [3, 5 ..]这个表达式吗? -
不,我理解表达式本身的作用,它是我不理解的 filter 的第一个参数 ((==1) .length . primeFactors)
标签: haskell primes pointfree function-composition