2017-04-23 15 views
4

コマンドライン引数をhaskellで解析しようとしています。コマンドライン引数を解析する

import System.Environment 

work :: [Integer] -> Int 
work (s:r:t:es) = length es 

main :: IO() 
main = getArgs >>= putStrLn . show . work . (map read) 

私はそれを実行:

./test 2 10 10 [7, 3, 5, 4, 4] 

期待ように出力が5以下

は、サンプルコードです。 しかし、私は整数との和とのIntと長さを交換する場合、実行は

test: Prelude.read: no parse 

エラーを発生させます誰かがこれを行う方法を説明できますか?

答えて

6

getArgsによって返されるリストは、["2", "10", "10", "[7,", "3,", "5,", "4,", "4]"]のようになります。それらの文字列の最初の3文字は整数の有効な文字列表現ですが、他の文字列は有効ではありません。だから、readを使用すると、エラーが発生します。

長さを計算するときにエラーが表示されない理由は、lengthはリスト内の値を調べる必要がないため、readは評価されません。

しかし、値を合計するには、評価する必要があります。だからこそ、あなたは例外を受けるのです。

問題を解決するには、大カッコとコンマを含まないように引数の書式を変更するか、引数を手動で調べて大括弧とカンマを削除してからreadに渡します。

もう1つの方法は、後の引数をスペースで区切って連結することです( "[7,3,5,4,4]"になります)。その後、単一の文字列としてreadに渡しますタイプ[Integer]

関連する問題