今日、Haskell で最初のプログラムを書きました。正常にコンパイルおよび実行されます。そして、これは典型的な「Hello World」プログラムではないため、実際にはそれ以上のことを行うので、よろしくお願いします :D
とにかく、自分のコードと Haskell の構文に関しては、ほとんど疑いがありません。
問題:
N
私のプログラムは、標準入力から整数を読み取り、i
範囲内の各整数について、 が素数[1,N]
かどうかを出力します。i
現在、入力エラーのチェックは行っていません。:-)
解決策:(疑問/質問も)
この問題を解決するために、整数の素数性をテストする次の関数を作成しました。
is_prime :: Integer -> Bool
is_prime n = helper n 2
where
helper :: Integer -> Integer -> Bool
helper n i
| n < 2 * i = True
| mod n i > 0 = helper n (i+1)
| otherwise = False
それはうまくいきます。しかし、このチュートリアルで読んだことが機能せず、このエラーが発生したため、最初の行は多くの試行錯誤の結果であるとは思えません (そうは言っていませんが、これはエラーだと思います) ):
prime.hs:9:13:
Type constructor `Integer' used as a class
In the type signature for `is_prime':
is_prime :: Integer a => a -> Bool
チュートリアル(ちなみに、これはよくできたチュートリアルです) によると、最初の行は次のよう(Integral a) => a -> String
(Integer a) => a -> Bool
になります。
is_prime :: (Integer a) => a -> Bool
これは機能せず、上記の投稿されたエラー (?) が表示されます。
そして、なぜそれが機能しないのですか?この行 (機能しない) と行 (機能する) の違いは何ですか?
1
また、にループする慣用的な方法は何N
ですか? コード内のループに完全に満足していません。改善を提案してください。これが私のコードです:
--read_int function
read_int :: IO Integer
read_int = do
line <- getLine
readIO line
--is_prime function
is_prime :: Integer -> Bool
is_prime n = helper n 2
where
helper :: Integer -> Integer -> Bool
helper n i
| n < 2 * i = True
| mod n i > 0 = helper n (i+1)
| otherwise = False
main = do
n <- read_int
dump 1 n
where
dump i x = do
putStrLn ( show (i) ++ " is a prime? " ++ show (is_prime i) )
if i >= x
then putStrLn ("")
else do
dump (i+1) x