2011-06-03 57 views
4

我用一个简单的程序玩弄在Haskell:哈斯克尔做语法和I/O

hello :: String -> String 
hello s = "Hello, " ++ (trim s) ++ "!\n" 

trim :: String -> String 
trim [] = [] 
trim s = head $ words s 

main :: IO() 
main = do putStr "\nPlease enter your name: " 
      name <- getLine 
      hstring <- return $ hello name 
      putStr hstring 

这是我期待的输出:

Please enter your name: John Doe 
Hello, John! 

这工作当我加载预期该程序转化为ghci。然而,当我编译使用该程序

ghc -o hello.exe hello.hs 

启动,等待输入,然后同时打印两个提示:

John Doe 
Please enter your name: Hello, John! 

为什么是交互式环境和编译器之间不同的行为,我怎样才能让编译器做我想做的事?

在此先感谢您的帮助!

+0

'主要= putStr “请输入你的名字:” >>函数getline >> = putStr。你好“ - 只是为了好玩。 – 2011-06-03 20:25:38

回答

8

这是常见问题。您的线路正在缓冲。使用:

import System.IO 

main = do 
    hSetBuffering stdout NoBuffering 
    ... 

此外,您的代码有点...独特。例如,你说:

hstring <- return $ hello name 
putStr hstring 

当你可以这样做:

let hstring = hello name 
putStr hstring 

或者只是:

putStr $ hello name 
+2

当禁用所有缓冲过多时,明智地使用'hFlush stdout'是个不错的选择。 – Anthony 2011-06-03 07:03:44

+0

我仍然不明白为什么在问题中发布的代码会导致错误的输出。这个符号中的动作是不是应该被排序? – is7s 2011-06-03 12:06:22

+0

@ is7s,这也是我的想法。 – astay13 2011-06-03 12:18:41