dass Denken Sie daran, in do-Syntax, der Ausdruck auf der rechten Seite des Pfeils muss ein „abgehoben“ oder einen „monadischen“ -Typ. Dies ist im Fall von getArgs :: IO [String]
der Fall, weshalb dieser Linientyp überprüft wird.
Aber in der nächsten Zeile args !! 0
ist gezwungen, Typ IO t0
zu haben, wo t0
ist ein Typ der Typchecker in den Prozess der Typenkontrolle eingeführt.
main :: IO()
main = do
args <- getArgs
-- :: IO [String]
p <- args !! 0
-- :: IO t0, for some t0
...
Da die Typprüfer von args !! 0 :: IO t0
eingeschränkt ist, folgert sie, dass args
Typ haben muss [IO t0]
(dies folgt aus (!!) :: [a] -> Int -> a
). Aber das steht im Widerspruch zu args :: [String]
, die diese ziemlich nicht hilfreiche Fehlermeldung verursacht.
Was Sie eigentlich in diesem Szenario wollen, ist eine Berechnung mit !!
, die rein ist und keinen Wert in IO
überhaupt zurückgibt. Sie können entweder "Lift" die Berechnung in IO
mit pure
oder return
:
main :: IO()
main = do
args <- getArgs
-- :: IO [String]
p <- pure (args !! 0)
-- :: IO [String]
...
oder Sie eine Notation speziell für diese Situation reserviert verwenden können, ein let
-Bindung:
main :: IO()
main = do
args <- getArgs
-- :: IO [String]
let p = args !! 0
-- :: String
...
Du hast versprochen, 'zurückzukehren IO() 'von' main'; Die einfachste Lösung besteht darin, am Ende Ihres 'do' ein' return() 'hinzuzufügen. – MicroVirus