Ich versuche einen sehr einfachen Argument Parser gemustert aus this example. Das erste Argument sollte ein Double sein, das zweite sollte eine ganze Zahl sein, und wenn sie nicht beide dieser Typen sind, würde ich gerne die Standardargumente für beide im else angeben. Hier ist, was ich habe:Einfache Art Fehler beim Parsen des Ergebnisses von 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)
Ich verstehe, gibt es anspruchsvollere Wege zu analysieren Argumente mit einem optparse-inspirierten Design mit Applicative
, aber ich bin noch nicht da.
Hier ist der Fehler, den ich bekommen:
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)
ich das nicht verstehen. Wenn ich auf die Signatur von getArgs
schaue, sehe ich nichts Seltsames, was darauf hindeutet, dass ich mein Int nicht zurückbekomme oder dass es (Double,Integer)
anstatt nur Integer
zurückgibt.
Wie kann ich das richtig machen?
'return' ist eine Funktion von' a -> ma', wobei 'm 'ist eine Monade; es ist nicht Teil der 'do'-Syntax. Schreiben Sie einfach '(v1, v2)', um den Wert '(v1, v2)' zu erhalten. – Ryan
Danke. Ich habe nur return hinzugefügt, weil, als ich nur die let-Anweisungen hatte, der Compiler mir gesagt hat, dass die letzte Zeile eines do-Blocks ein Ausdruck sein muss, und dass er kompilieren konnte. Ich verstehe dieses Verhalten jetzt besser basierend auf den Antworten unten. – Mittenchops
Beachten Sie, dass 'read' einen Fehler auslöst (und das Programm abstürzt), wenn die angegebenen Zeichenfolgen nicht in den entsprechenden Typ umgewandelt werden können. Wenn Sie das verbessern wollen, empfehle ich ['readMaybe'] (https://hackage.haskell.org/package/base-4.9.1.0/docs/Text-Read.html#v:readMaybe) von' Text .Read', das 'Nothing' ausgibt, wenn es fehlschlägt. – duplode