我试图用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)
如果有人想要解决这个特殊问题,我们将非常感激。
答案 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
。