Haskellでコマンドライン引数を受け取る

こっちで、Pyhtonでコマンドライン引数を受け取る方法のメモを書いたが、そういえばこっちもやったことなかったので、Haskellでもメモ。

コマンドライン引数を受け取る

System.EnvironmenモジュールのgetArgsを使用する。コマンドライン引数のリストが取得できる。

commandline_args.hs
import           System.Environment (getArgs)

main :: IO ()
main = do
  args <- getArgs
  putStrLn $ args !! 0
  putStrLn $ args !! 1
$ stack runghc commandline_args.hs a b

で実行すると、
出力は、

a
b

となる。
Pythonとは違い、引数リストに実行ファイル名は、含まれない。

実際の使用時

実際使用する際は、おそらく、いくつの引数を受け取ったかを確認し、
さらに、期待する形の入力かをチェックする必要がありそう。

fizzBuzz.hs
import           Data.Char          (isDigit)
import           System.Environment (getArgs)


main :: IO ()
main = do
  let isDigitOnly cs = foldl (\b c -> b && isDigit c ) True cs
  args <- getArgs
  if 1 <= length args
  then do
    let n = (args !! 0)
    if isDigitOnly n
    then
      fizzBuzz (read n :: Int)
    else
      putStrLn "Argument is not digit"
  else
    putStrLn "Arguments are too short"

  return ()

fizzBuzz n
  | n <= 0 = return ()
  | otherwise = do
      fizzBuzz $ n - 1
      fizzBuzz' n

fizzBuzz' n
  | multiplesOf15 = putStrLn $ prefix ++ "FizzBuzz"
  | multiplesOf3  = putStrLn $ prefix ++ "Fizz"
  | multiplesOf5  = putStrLn $ prefix ++ "Buzz"
  | otherwise     = putStrLn $ prefix ++ show n
    where
      multiplesOf3  = n `mod` 3 == 0
      multiplesOf5  = n `mod` 5 == 0
      multiplesOf15 = multiplesOf3 && multiplesOf5
      prefix = show n ++ " : "
  • 引数無し

引数無しエラー

$ stack runghc commandline_args.hs
Arguments are too short
  • 引数が数値じゃない

引数タイプエラー

$ stack runghc commandline_args.hs a
Argument is not digit

  • 引数が数値

正常実行

$ stack runghc commandline_args.hs 15
1 : 1
2 : 2
3 : Fizz
4 : 4
5 : Buzz
6 : Fizz
7 : 7
8 : 8
9 : Fizz
10 : Buzz
11 : 11
12 : Fizz
13 : 13
14 : 14
15 : FizzBuzz
  • 引数が数値で、複数存在

最初の1つを使用し実行

$ stack runghc commandline_args.hs 3 5 15
1 : 1
2 : 2
3 : Fizz
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.