Estoy escribiendo un pequeño script de shell en Haskell que puede tomar un argumento opcional. Sin embargo, si el argumento no está presente, me gustaría obtener una línea de stdin para pedir un valor.Forma idiomática de procesar condicionalmente IO en Haskell
¿Cuál sería la forma idiomática de hacer esto en 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
Ah, y si hay una manera de hacerlo con algo de Control.Applicative
o Control.Arrow
me gustaría saber. Me he entusiasmado con estos dos módulos.
Gracias!
Me gusta. Está bastante limpio. Los patrones en la expresión de casos no son exhaustivos, pero se pueden corregir fácilmente. –
@ Ionuţ G. Stan: Simplemente traduzco tu significado uno por uno. Hacer el patrón exhaustivo haría que mi ejemplo fuera menos limpio. – fuz
Pondría 'lowerCase <$>' delante de 'case args of' para que la línea de comando arg también se ponga en minúscula. Además, podría hacer coincidir '[arg]' y '_' (en lugar de' [] ') para estar más cerca del comportamiento solicitado. –