私は自分自身にHaskellを教えようとしています。サンプルプログラムとして、私はスパイダーソリティアプレーヤーを書いています。
を使用してコマンドラインパーサーを作成しようとしていSystem.Console.GetOpt
ます。このプログラムの引数解析を行う簡単な方法があることは知っていますが、GetOpt
モジュールの使用方法を学びたいと思います。これは、後で作成する他のプログラムで高度な機能が必要になると予想されるためです。
使用状況メッセージを出力して終了する「--help」オプションを追加しようとしています。また、「-games」オプションまたは「--suits」オプションのいずれかの引数が有効な整数でない場合(ゲーム> =1および<=1000、スーツ== 1、2、または4)。Options
結果のデータ型をプログラムの他の部分に渡します。
progName
範囲外のエラーも発生します。case
ステートメントはブロックparseArgs
の範囲内にありませんか?do
これが私のコードで、「RealWorldHaskell」とHaskellwikiの例からパッチを当てたものです。
module Main (main) where
import System.Console.GetOpt
import System.Environment(getArgs, getProgName)
data Options = Options {
optGames :: Int
, optSuits :: Int
, optVerbose :: Bool
} deriving Show
defaultOptions = Options {
optGames = 1
, optSuits = 4
, optVerbose = False
}
options :: [OptDescr (Options -> Options)]
options =
[ Option ['g'] ["games"]
(ReqArg (\g opts -> opts { optGames = (read g) }) "GAMES")
"number of games"
, Option ['s'] ["suits"]
(ReqArg (\s opts -> opts { optSuits = (read s) }) "SUITS")
"number of suits"
, Option ['v'] ["verbose"]
(NoArg (\opts -> opts { optVerbose = True }))
"verbose output"
]
parseArgs :: IO Options
parseArgs = do
argv <- getArgs
progName <- getProgName
case getOpt RequireOrder options argv of
(opts, [], []) -> return (foldl (flip id) defaultOptions opts)
(_, _, errs) -> ioError (userError (concat errs ++ helpMessage))
where
header = "Usage: " ++ progName ++ " [OPTION...]"
helpMessage = usageInfo header options
main :: IO ()
main = do
options <- parseArgs
putStrLn $ show options