2017-06-11 25 views
0

私は、渡される引数に応じて、コマンドラインから直接またはファイルから入力を読み取ることができるプログラムを作成しています。例えば。しかし、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) 

入力がファイルの名前でない場合、これはエラーになります。これを行う賢明な方法はありますか?問題に間違って近づいていますか?

+3

最初のコードでは、 '(head args)'はIOアクションではありませんが、 '(readFile(head args))'はそうです。あなたは2種類のタイプを返します。 '(head args)'を ''(return(head args)) ''に変更して、値をIOモナドに入れてみてください。 – Carcigenicate

+0

@Carcigenicateありがとう!これはまさに私が探していたものです。あなたがこれを詳述する回答を投稿したいのであれば、私は受け入れてくれるでしょう。 –

+1

無関係ですが、 'args'が空でないことをどのように知っていますか? – chepner

答えて

4

あなたは(head args)をIOモナドのように扱おうとしていました。単なる生の値なので、IOアクションとして使用する前にモナドに配置する必要があります。

(head args)から(return (head args))に変更してください。

1

return (head args)を使用して、タイプをIOモナドに持ち上げることができます。