私は、渡される引数に応じて、コマンドラインから直接またはファイルから入力を読み取ることができるプログラムを作成しています。例えば。しかし、IOイベントを条件付きにするのに問題があります。私が最初に考えたのはやっていた。条件付きIOアクション
import System.Environment
main :: IO()
main = do
cla <- getArgs
let flags = parseFlags (filter isFlag cla) []
let args = filter (not.isFlag) cla
input <- if (elem "e" flags) then (head args) else (readFile (head args))
(head args)
がIOアクションではありませんので、しかし、これは動作しません。
import System.Environment
main :: IO()
main = do
cla <- getArgs
let flags = parseFlags (filter isFlag cla) []
let args = filter (not.isFlag) cla
file <- (readFile (head args))
let input = if (elem "e" flags) then (head args) else (file)
入力がファイルの名前でない場合、これはエラーになります。これを行う賢明な方法はありますか?問題に間違って近づいていますか?
最初のコードでは、 '(head args)'はIOアクションではありませんが、 '(readFile(head args))'はそうです。あなたは2種類のタイプを返します。 '(head args)'を ''(return(head args)) ''に変更して、値をIOモナドに入れてみてください。 – Carcigenicate
@Carcigenicateありがとう!これはまさに私が探していたものです。あなたがこれを詳述する回答を投稿したいのであれば、私は受け入れてくれるでしょう。 –
無関係ですが、 'args'が空でないことをどのように知っていますか? – chepner