Hi all,

I'm trying to write a fairly simple program to understand Haskell in practice. I am implementing a simple REPL where I can write some text, and that text can be parsed into a command with arguments. Then, I would like to be able to turn this into a 'plugin' system of sorts, with a module/logic per command.

I understand the Text.Parsec library may already provide these things out of the box, but for now, I would prefer to reinvent the wheel.

The program below is what I have working right now (very trivial). I want to modify this program, so that the `evaluate input` returns not a String, but a type X that includes information on whether to "continue" and show a prompt after rendering the result, or exit altogether. So the specific questions I have here are:

1. What would be a sensible type signature for X?
2. Assuming X to exist, what is the right way to modify main to use it? My current intuition is to modify the outputStrLn ... loop statements to include an if-then-else, but I'm not sure what the right modification is (all my attempts seemed like imperative programming and failed compilation unsurprisingly).

import Evaluator
import System.Console.Haskeline

main :: IO ()
main = runInputT defaultSettings loop
  where
    loop :: InputT IO ()
    loop = do
      line <- getInputLine ">> "
      case line of
        Nothing     -> return ()
        Just "quit" -> return ()
        Just input  -> do
          outputStrLn $ "Executing: " ++ (evaluate input)
          loop

module Evaluator where

evaluate :: String -> String
evaluate value = value