2012-03-17 10 views
7

私はかなりハスケルに新しいです。ストリームの終わりまでコンソールから行を読み続け、大文字ですべてを出力したいと思います。これまでのところ、私はストリームの終わりまで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")状況を回避し、ストリーム条件の終わりと交換する方法を見つけ出すように見えることはできません。要するに

、私はSystem.IOからC++

+0

Dave4420から回答を選択する必要があります。解決策の説明に問題がある人が実際に回答していることを示しています。 – Titou

答えて

8

たくさんこれは道あなたが本当にのために求めているものを超えて、私はこのパターンを使用します。interact

myFun :: String -> String 
myFun = ... 

main = interact (unlines . myFun . lines) 

あなたの機能myFunは、標準入力とのすべての行に対して実行されますが結果は標準出力に送られます。

+0

ghciの好奇心だと思うが、 'main = interact(unlines。map(map toUpper)。lines)>> putStrLn" bye "'は内部で動作しないghci - 'interact toUpper'のようなものですが、runhaskellをコンパイルしたり使うとKshitij Mehtaが望むことをします – applicative

+0

@ applylicative何が問題なのでしょうか?私が遭遇した奇妙なことは、CTRL-Dを使用して入力の終わりを知らせるのではなく、CTRL-Cを使用して入力を中断する必要があることです。 "ghc -e"の対話も同じです(unlines。map(map toUpper)。行)>> putStrLn \ "bye \" " –

+0

ghciの最初の行" first line "は、このfFiIrRsStT LLiInNeEのようになります。 – applicative

15

使用isEOFwhile (cin >> line)にHaskellの同等を探しています。

import System.IO (isEOF) 
import Data.Char 

main = myLoop 

myLoop = do done <- isEOF 
      if done 
       then putStrLn "Bye!" 
       else do inp <- getLine 
         putStrLn (map toUpper inp) 
         myLoop 
+0

'done == True'ブランチで意味のある計算が行われないので、' done do $ do ... 'を使わない方が少し良いスタイルかもしれません。 –

+0

質問は+本当に長いファイルで動作する解決策を与える – Titou

4

また、遅延IOに依存することもできます。

import Data.Char 

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

別のオプションは、そのドキュメントhereを見つけることができますwhenを使用することです:

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 

そうでなければ、答えはthe one by @dave4420と同じです。

+0

あなたの答えを愛してください。 – Ch3shire

関連する問題