使用putStr在错误的时刻打印的消息

时间:2017-02-11 14:54:05

标签: haskell functional-programming

import Control.Monad
import Data.Char

main = forever $ do
    putStr "Give me some input: "
    l <- getLine
    putStrLn $ map toUpper l

我一直在学习Haskell,因为你学习了哈克尔。当我尝试运行此代码时,它的行为并不像它应该的那样。

l
Give me some input: L
abc
Give me some input: ABC

当我运行它时,它不会首先打印字符串,我可以输入。提供一些输入后,在这种情况下l它会返回我:Give me some input: L

它应该做的是,通过打印Give me some input:请求输入,输入后它将以大写形式返回输入。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

正如Michail指出的那样,这是一个缓冲问题,stdout import Control.Monad import Data.Char import System.IO main = do hSetBuffering stdout NoBuffering forever $ do putStr "Give me some input: " l <- getLine putStrLn $ map toUpper l 可以解决这个问题:

import Control.Monad
import Data.Char
import System.IO

main = do
    forever $ do
    putStr "Give me some input: "
    hFlush stdout
    l <- getLine
    putStrLn $ map toUpper l

如果由于某种原因您不想更改整个程序的hSetBuffering,您可以使用buffer mode在您需要的地方进行额外的缓冲刷新:< / p>

Intent sendIntent = new Intent("android.intent.action.MAIN");
                    sendIntent.SetComponent(new ComponentName("com.whatsapp", "com.whatsapp.Conversation"));
                    sendIntent.SetType("text/plain");
                    sendIntent.PutExtra("jid", phone_number + "@s.whatsapp.net");
                    sendIntent.PutExtra(Intent.ExtraText, "extra_text test");
                    sendIntent.PutExtra("sms_body", "sms_body test");
                    sendIntent.PutExtra("body", "body test");
                    sendIntent.PutExtra("text", "text test");
                    context.StartActivity(sendIntent);

答案 1 :(得分:1)

试试这个:

import Control.Monad
import Data.Char

main = forever $ do
    putStrLn "Give me some input: "
    l <- getLine
    putStrLn $ map toUpper l

这里的问题是putStr没有写新行。并且输出缓冲区仅在换行符上刷新。