type Primes = [Integer]
素数で順に割っていき、素因数だった場合は割って新しい値にしていくのが効率良さそう
solve :: Integer -> Primes -> Integer
solve n primes@(p:ps)
| n < p^2 = n
| n `mod` p == 0 = solve (n `div` p) primes
| otherwise = solve n ps
素因数かどうかの判定は平方根までみれば良い
primes = sieve $ 2:[3,5..] -- 偶数は抜くというせめてものあがき
sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p /= 0]
よくあるHaskellならではの素数生成法
再帰を直接書くのは低級な行為だと教わったので、(効率を保ったまま)畳込みなどで書く方法が知りたいです
計算量, 見やすさ, 文化的な観点から見て改善点や他回答があればぜひお願いします!
実務1年程度のへっぽこプログラマーなので暖かくも厳しく見守ってください
読んだ本
つまり構文を知った程度で、関数型言語っぽい書き方を学び中です