2016-04-09 6 views
0

Let‘betrachten:Notwendigkeit der [IO t0] in main :: tun

main :: IO() 
main = 
    do 
     args <- getArgs 
     p <- args !! 0 

ghc sagt:

Couldn't match type `[Char]' with `IO t0' 
    Expected type: [IO t0] 
     Actual type: [String] 

Ich kann nicht verstehen, warum [IO t0] notwendig hier ist und wie ir zu reparieren.

+0

Du hast versprochen, 'zurückzukehren IO() 'von' main'; Die einfachste Lösung besteht darin, am Ende Ihres 'do' ein' return() 'hinzuzufügen. – MicroVirus

Antwort

7

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 
    ... 
4

args ist ein [String] also args !! 0 ist ein String. Da die Monade in mainIO ist, muss p Typ IO a für einige a haben, aber es ist ein String. Es sieht aus wie Sie let wollen stattdessen verwenden:

main = 
    do 
     args <- getArgs 
     let p = args !! 0 
     ...