私は非常に単純な引数パーザをthis exampleでパターン化しようとしています。 最初の引数はdoubleでなければならず、2番目の引数は整数でなければなりません。両方の型でなければelseで指定された両方のデフォルト引数を使いたいと思います。私はApplicative
を使用してoptparseは風デザインと引数を解析するために、より洗練された方法があります理解getArgsの結果を解析する際のシンプルなタイプのエラー
parseArgs :: [String] -> (Double, Integer)
parseArgs args = do
if length(args) == 2 then do
let v1 = read (args !! 0) :: Double
let v2 = read (args !! 1) :: Integer
return (v1, v2)
else do
let v1 = read ("0.5") :: Double
let v2 = read ("5") :: Integer
return (v1, v2)
が、私はまだありませんよ。ここに私が持っているものです。
myscript.hs:186:5-31: error: …
• Couldn't match type ‘(Double, Integer)’ with ‘Integer’
Expected type: (Double, Integer)
Actual type: (Double, (Double, Integer))
• In a stmt of a 'do' block: return (v1, v2)
私はこのことを理解していない:
は、ここに私が取得エラーです。 getArgs
のシグネチャを見ると、私は自分のintを返すことができないという奇妙なものは見当たりません。それともInteger
ではなく(Double,Integer)
を返さなければなりません。
これを正しく行うにはどうすればよいですか?
'return'は'からの機能である - 'メートル> ma'、 'はモナドです。これは 'do'構文の一部ではありません。値 '(v1、v2) 'を得るために'(v1、v2) 'を書くだけです。 – Ryan
ありがとうございます。私はlet文しか持っていなかったので、コンパイラはdoブロックの最後の行を式にしなければならず、コンパイルすることができたと私に言いました。私は以下の答えに基づいて、今この行動をよりよく理解しています。 – Mittenchops
与えられた文字列が適切な型に解析できないとき、 'read'はエラーをスローし(そしてプログラムをクラッシュさせることに注意してください)。それを改善したいなら、 '' ReadMaybe'(https://hackage.haskell.org/package/base-4.9.1.0/docs/Text-Read.html#v:readMaybe)を 'Text .Read'は、失敗したときに 'Nothing'を出力します。 – duplode