在Haskell中有条件地处理IO的惯用方法

Ion*_*tan 7 io conditional haskell coding-style command-line-arguments

我在Haskell中编写了一个小shell脚本,可以使用可选参数.但是,如果参数不存在,我想从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
Run Code Online (Sandbox Code Playgroud)

哦,如果有办法用某些东西来做,Control.Applicative或者Control.Arrow我想知道.我对这两个模块非常热衷.

谢谢!

fuz*_*fuz 9

main :: IO ()
main = do args <- getArgs
          name <- lowerCase <$> case args of
            [arg] -> return arg
            _     -> readPrompt "Gimme arg: "
          putStrLn name
Run Code Online (Sandbox Code Playgroud)