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

Ovidiu D ovidiudeac at gmail.com
Mon Apr 1 14:37:07 CEST 2013


I understand. Thanks a lot for the explanation and for the documentation.

ovidiu


On Mon, Apr 1, 2013 at 2:17 PM, Lyndon Maydwell <maydwell at gmail.com> wrote:

> 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
>>
>>
>
> _______________________________________________
> 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/ecf8ab3a/attachment.htm>


More information about the Beginners mailing list