在haskell中阅读直到流结束
我是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)
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