适用于小型Twitter客户端的Haskell IO cli菜单

时间:2016-07-10 16:27:53

标签: haskell

我试图用haskell制作一个非常简单的Twitter客户端,为了简单起见我试图制作一个简单的putStrLn和getLine(我不知道这是否是问题的最佳解决方案,我对哈斯克尔来说还不错。

我想做类似的事情,但输出类型不同,所以会产生很大的错误:

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])

就像我上面解释的那样它会给你错误:

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

和:

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

如果有人想要解决这个特殊问题,我们将非常感激。

1 个答案:

答案 0 :(得分:2)

如果您的IO操作返回一个值,例如inbox :: IO(Either String [DM]),但您想在需要IO ()的位置使用它,则可以忽略返回的值并使用{{1}跟随它其类型为return ()

IO ()

除此之外:您可以使用case expression代替嵌套 if(numero == 1 ) then do frase <- getLine tweet frase return () else ... 来简化缩进。

if ... then ... else

我还用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" 替换了getLine :: IO String