8

文字列を読み取って無期限に出力するこの単純なコードがあります。

main :: IO ()
main = getLine >>= putStrLn >> main

getLine行が「quit」または「exit」の場合、呼び出し後に終了したいと思います。

私の試み:

main :: IO ()
main = do
  line <- getLine
  if line == "exit" || line == "quit"
  then return ()
  else putStrLn line >> main

私には慣用的に見えません。より良い方法はありますか?

4

5 に答える 5

4

if/elseやdo表記を使っているため、コードのシーケンシャル感が気になっているようです。次のようなものを試すことができます:

main = getLine >>= proc
  where
    proc s | s == "exit" || s == "quit" = return ()
           | otherwise = putStrLn s >> main
于 2013-08-17T16:22:20.417 に答える
3

ファッショナブルになるための試み:

module Main where

import Control.Monad
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Class
import System.IO

isValid s = s ≠ "quit" && s ≠ "exit"

getL ∷ MaybeT IO String
getL = do s ← lift getLine
          guard (isValid s)
          return s


main = runMaybeT main' where
  main' = do
      lift $ putStr "Enter line: "
      lift $ hFlush stdout
      s ← getL
      lift $ putStrLn $  "Your line is: " ⧺ s
      main'
于 2013-08-17T16:50:57.640 に答える