[Haskell-beginners] [IO String] to IO [String]

Lyndon Maydwell maydwell at gmail.com
Mon Apr 1 13:17:31 CEST 2013


Ah I see what you're saying.


interact [1] uses hGetContents [2] to read the user-input. This is a
lazy-io function which is also used in readFile [3]. In the same way that
readFile won't read the entire file if its contents aren't used, neither
will interact. There is debate as to weather this is a good way to handle
(lol) IO, with other solutions including Conduit [4] and Pipes [5], but for
simple programs it is an elegant solution.


[1]
http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/System-IO.html#interact
[2]
http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-IO.html#v:hGetContents
[3]
http://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/src/System-IO.html#readFile
[4] http://hackage.haskell.org/package/conduit
[5] http://hackage.haskell.org/package/pipes

I hope this helps :)

On Mon, Apr 1, 2013 at 5:54 PM, Ovidiu D <ovidiudeac at gmail.com> wrote:

> On Mon, Apr 1, 2013 at 11:52 AM, Lyndon Maydwell <maydwell at gmail.com>wrote:
>
>> The untilexit definition is pretty straightforward. You can see that the
>> the function operates on a string. There are two cases where nothing is
>> returned: "" and "exit" ++ rest.
>>
>>
> Ok, that's clear. What I don't understand is why does it stop interact? It
> returns the same thing if the input is empty or if it starts with "exit".
> Why doesn't it stop interact when the input line is empty?
>
>
>> In order to display a prompt before each input you will need to actually
>> display a prompt /after/ each line, and an additional prompt before you
>> start processing input.
>>
>
> I was trying to do that but I was doing it wrong. Anyway this is the
> result which works as expected now, although I don't really understand why
> it stops at 'exit'
>
> import System.IO
>
> prompt = ">> "
>
> main :: IO ()
> main = do
>     hSetBuffering stdout NoBuffering
>     putStr prompt
>     interact $ display . map reverse . lines . untilexit
>
> display =  concat . map appendPrompt
>     where appendPrompt line = line ++ "\n" ++ prompt
>
>
> untilexit :: String -> String
> untilexit ('e':'x':'i':'t':_)  = []
> untilexit (c:t)               = c : untilexit t
> untilexit []                  = []
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130401/119672e4/attachment.htm>


More information about the Beginners mailing list