社会不適合者の部屋
## 最初に 自分はHaskell初心者なので最適化が出来ていないかもしれません。 ご指摘は、この記事に書いているTwitterアカウントにしていただけると幸いです。 ## まずfor文を組む Haskellにはfor文がありません、なのでまず疑似的なfor文を作りましょう ``` for :: Int -> Int -> IO () for n max | n > max = putStrLn "END" | otherwise = do for (n + 1) max ``` もしnがmaxを超えていたらENDと出力し、otherwise(それ以外)ならfor関数内からfor関数をn+1の状態で送信します。 これによってfor文を再現します。 ## 実行時に上限値を入力できるようにする 実行時に毎回値を入力するのは面倒なので、readLnをつかって実行時に値を入力するようにします。 そして入力結果を代入したnを先ほど作ったfor関数にいれて実行します。 ``` main :: IO () main = do putStrLn "上限値を設定してください" n <- readLn for 2 n ``` ## 素数判定 ここに関しては数時間オリジナルで作っていましたが、挫折したので他サイトから取ってきました。 ``` isPrime :: Int -> Bool isPrime 1 = False isPrime 2 = True isPrime n = all (isNotDivisible n) [2..end] where end = floor $ sqrt (fromIntegral n) isNotDivisible :: Int -> Int -> Bool isNotDivisible x y = x `mod` y /= 0 ``` ###### 引用元: https://zenn.dev/shinpallini/articles/haskell-part5-mondai10-11 これを元のコードに入れると、こうなります。 ``` for :: Int -> Int -> IO () for n max | n > max = putStrLn "END" | isPrime n = do for (n + 1) max | otherwise = do for (n + 1) max isPrime :: Int -> Bool isPrime 1 = False isPrime 2 = True isPrime n = all (isNotDivisible n) [2..end] where end = floor $ sqrt (fromIntegral n) isNotDivisible :: Int -> Int -> Bool isNotDivisible x y = x `mod` y /= 0 main :: IO () main = do putStrLn "上限値を設定してください" n <- readLn for 2 n ``` ## 結果をファイルに出力する ログ出力する方法もありましたが、他言語で使う事も考えて、ファイルに出力しようと思います。 appendFileとwriteFileを使います。 上記の二つを使う際には以下のようにインポートする必要があります。 ``` import System.IO () ``` #### それをふまえた上でコードを書くとこうなります。 ``` import System.IO () for :: Int -> Int -> IO () for n max | n > max = putStrLn "END" | isPrime n = do appendFile "prime.txt" (show n ++ "\n") for (n + 1) max | otherwise = do for (n + 1) max isPrime :: Int -> Bool isPrime 1 = False isPrime 2 = True isPrime n = all (isNotDivisible n) [2..end] where end = floor $ sqrt (fromIntegral n) isNotDivisible :: Int -> Int -> Bool isNotDivisible x y = x `mod` y /= 0 main :: IO () main = do writeFile "prime.txt" "" putStrLn "上限値を設定してください" n <- readLn for 2 n ``` appendFile等を入れたことによって開始時にprime.txtを初期化して、その後、素数を書き連ねていくプログラムが書けました。 <br> **使う際はrunghc又はghcで実行してみてください** ```console runghc main.hs ``` ```console ghc main.hs ``` 以上で説明を終わります。ご指摘等ありましたら、以下の連絡先にご連絡いただければ幸いです。 ## 連絡先 ご指摘はこちらまで https://twitter.com/robot_neet ## 引用元 https://github.com/ROBOTofficial/Prime.hs https://zenn.dev/shinpallini/articles/haskell-part5-mondai10-11
詳細
タイトル: Haskellで素数判定プログラムを書こう!
閲覧数: 222
更新履歴
Mon Apr 29 2024 03:51:48 GMT+0900 (日本標準時)
Sun Jun 09 2024 04:24:41 GMT+0900 (日本標準時)
他の記事を見る