2016-07-10 3 views
2

Ich versuche, eine wirklich einfache Twitter-Client mit Haskell zu machen, und die Dinge einfach zu machen Ich habe versucht, eine einfache putStrLn und getLine (ich weiß nicht, ob dies die beste Lösung ist für das Problem oder nicht, ich bin ziemlich neu in Haskell).Haskell IO Cli-Menü für kleine Twitter-Client

Ich wollte so etwas tun, aber die Ausgangstypen sind unterschiedlich, so seine gonna geben einen massiven Fehler:

main:: IO() 
main = do 
    putStrLn "1)Tweet\n 2)Timeline\n 3)DM\n 4)Inbox\n" 
    numero <- getLine 
    if(numero == 1) 
     then do 
      frase <- getLine 
      tweet frase 
     else 
      if(numero == 2) 
       then do 
        frase <- getLine 
        timeline frase 
      else 
       if(numero == 3) 
        then do 
         frase <- getLine 
         nome <- getLine 
         dm frase nome 
        else 
        if(numero == 4) 
          then 
           inbox 
          else do 
            PutstrLn "Invalido" 


tweet :: String -> IO (Either String Tweet) 

timeline :: String -> IO (Either String [Tweet]) 

dm :: String -> String -> IO(Either String DM) 

inbox :: IO(Either String [DM]) 

Und wie ich oben erklärt seine gonna geben Sie Fehler wie:

Main.hs:86:25: error: 
    Couldn't match type ‘Either String DM’ with ‘()’ 
    Expected type: IO() 
     Actual type: IO (Either String DM) 

und:

Main.hs:75:11: error: 
• Couldn't match type ‘Either String Tweet’ with ‘()’ 
    Expected type: IO() 
    Actual type: IO (Either String Tweet) 

Wenn jemand eine ideia hat sich diese besondere pr zu lösen Es würde sehr geschätzt werden.

+0

Bitte alle relevanten Codes und Fehlermeldungen posten. Es ist schwierig, Ihnen zu helfen, wenn Ihr Beitrag kein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) enthält. – Mephy

+0

@Mephy hinzugefügt einige Beispiele –

+0

Es gibt einen Tippfehler in der Frage. 'PutstLn' sollte' putStrLn' sein. – Cirdec

Antwort

2

Wenn Ihr IO Aktion einen Wert zurückgibt, wie inbox :: IO(Either String [DM]), aber Sie wollen, es zu benutzen, wo es eine IO() sein muss man den Rückgabewert ignorieren und sich anschließend einen return(), die den Typ hat IO().

if(numero == 1) 
     then do 
      frase <- getLine 
      tweet frase 
      return() 
     else 
      ... 

Abgesehen: Sie können die Einbuchtung für diese eine case expression vereinfachen kann anstelle von verschachtelten if ... then ... else s unter Verwendung.

main:: IO() 
main = do 
    putStrLn "1)Tweet\n 2)Timeline\n 3)DM\n 4)Inbox\n" 
    numero <- readLn 
    case numero of 
     1 -> do 
      frase <- getLine 
      tweet frase 
      return() 
     2 -> do 
      frase <- getLine 
      timeline frase 
      return() 
     3 -> do 
      frase <- getLine 
      nome <- getLine 
      dm frase nome 
      return() 
     4 -> do 
      inbox 
      return() 
     otherwise -> do 
      putStrLn "Invalido" 

Ich habe ersetzt auch getLine :: IO String mit readLn :: Read a => IO a.

+0

Ich kann Ihnen nicht genug danken, sehr gut erklärt, 10 von 10 –