Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在haskell中阅读直到流结束_Haskell - Fatal编程技术网

在haskell中阅读直到流结束

在haskell中阅读直到流结束,haskell,Haskell,我是Haskell的新手,我想一直从控制台读取行,直到流的末尾,并以大写输出我得到的所有内容。到目前为止,我有 import Data.Char main = myLoop myLoop = do inp <- getLine if (inp == "x") then putStrLn "Bye!" else do putStrLn(map toUpper inp)

我是Haskell的新手,我想一直从控制台读取行,直到流的末尾,并以大写输出我得到的所有内容。到目前为止,我有

import Data.Char

main = myLoop

myLoop = do inp <- getLine
            if (inp == "x") 
              then putStrLn "Bye!"
              else do putStrLn(map toUpper inp)
                      myLoop
然而,我似乎不知道如何避免if inp==x条件并用流结束条件替换它

简言之,我正在寻找Haskell的等价物,即C++中的while cin>>行


你也可以依靠懒惰的IO

import Data.Char

main :: IO ()
main = do
   inp <- getContents
   let ls = lines inp
       upcased = map (map toUpper) ls
   mapM_ putStrLn upcased

这远远超出了您真正的要求,但我经常使用这种模式:交互:

您的函数myFun将针对每一行标准输入执行,并将结果发送到标准输出

另一个选项是在可以找到其文档时使用:


否则,答案与相同。

我想这是ghci的好奇心,但main=interact未联机。地图图珀。行>>putStrLn bye在ghci内部不起作用-就像interact toUpper一样-但是如果您编译或使用runhaskell@applicative有什么不起作用?我遇到的唯一奇怪的事情是,不是使用CTRL-D来表示输入结束,而是必须使用CTRL-C来中断输入。这同样适用于ghc-e交互线。地图图珀。lines>>putStrLn\bye\在ghci中,第一行第一行看起来像这个ffirsttLLiInNeE@applicative这是您的输入与输出实时混合。如果你一行一行地去做,你会得到你所期望的行为。是的,我知道,让我惊讶的是编译版本的不同行为。它可能会稍微好一点,除非完成$do。。。由于在done==True分支中没有执行任何有意义的计算。答案问题+给出了一个可以处理很长文件的解决方案。您应该从Dave4420中选择答案-它表示有问题的人,您描述的解决方案中哪一个解决了问题。当我不一定要处理输入时,这非常好一次一行。
import Data.Char

main :: IO ()
main = do
   inp <- getContents
   let ls = lines inp
       upcased = map (map toUpper) ls
   mapM_ putStrLn upcased
myFun :: String -> String
myFun = ...

main = interact (unlines . myFun . lines)
import System.IO (isEOF)
import Data.Char (toUpper)
import Control.Monad (forever, when)
import System.Exit (exitSuccess)
main = myLoop

myLoop = forever $ do
                done <- isEOF
                when done $ putStrLn "Bye!" >> exitSuccess
                inp <- getLine
                putStrLn (map toUpper inp)
                myLoop