Идиоматический способ условной обработки ввода-вывода в Haskell

Я пишу небольшой сценарий оболочки на Haskell, который может принимать необязательный аргумент. Однако, если аргумент отсутствует, я Я хочу получить строку из stdin, в которой запрашивается значение.

Каким будет идиоматический способ сделать это в Haskell?

#!/usr/bin/env runhaskell

import Control.Applicative ((<$>))
import Data.Char (toLower)
import IO (hFlush, stdout)
import System.Environment (getArgs)

main :: IO ()
main = do args <- getArgs
          -- here should be some sort of branching logic that reads
          -- the prompt unless `length args == 1`
          name <- lowerCase <$> readPrompt "Gimme arg: "
          putStrLn name

lowerCase = map toLower

flushString :: String -> IO ()
flushString s = putStr s >> hFlush stdout

readPrompt :: String -> IO String
readPrompt prompt = flushString prompt >> getLine

Да, и есть ли способ сделать это с помощью чего-нибудь из Control.Applicative или Control.Arrow Я хотел бы знать. Мне очень понравились эти два модуля.

Спасибо!

7
задан Don Stewart 21 April 2011 в 13:36
поделиться