He escrito una pequeña pieza de código que se encarga de la entrada de una consola:código Acortar que maneja IO
main :: IO()
main = do
input <- readLine "> "
loop input
loop :: String -> IO()
loop input = do
case input of
[] -> do
new <- readLine "> "
loop new
"quit" ->
return()
_ -> do
handleCommand input
new <- readLine "> "
loop new
handleCommand :: String -> IO()
handleCommand command = do
case command of
"a" -> putStrLn "it was a"
"b" -> putStrLn "it was b"
_ -> putStrLn "command not found"
readLine :: String -> IO String
readLine prompt = do
putStr prompt
line <- getLine
return line
El código funciona bien, pero se ve feo y es redundante. En Scala logré escribir más corto:
object Test extends App {
val reader = Iterator.continually(readLine("> "))
reader takeWhile ("quit" !=) filter (_.nonEmpty) foreach handleCommand
def handleCommand(command: String) = command match {
case "a" => println("it was a")
case "b" => println("it was b")
case _ => println("command not found")
}
}
He intentado utilizar las funciones de orden superior con la mónada IO en Haskell, pero no pude. ¿Puede alguien darme un ejemplo de cómo acortar el código de Haskell?
Otro problema es que el orden de salida es diferente. En Scala es correcta:
$ scala Test
> hello
command not found
> a
it was a
> b
it was b
> quit
Mientras que en Haskell no lo es:
$ ./test
hello
> command not found
a
> it was a
b
> it was b
quit
> %
cómo solucionar esto?
El Scala puede acortarse también, por cierto, utilizando esencialmente el mismo diseño que tiene aquí. –
Esto es exactamente lo que estaba buscando. ¡Muchas gracias! – sschaef