Send Beginners mailing list submissions to
        beginners@haskell.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1.  Runtime error while feeding a binary to stdin
      (Manuel Vázquez Acosta)
   2. Re:  Runtime error while feeding a binary to      stdin
      (Theodore Lief Gannon)


----------------------------------------------------------------------

Message: 1
Date: Tue, 10 Jan 2017 17:46:23 -0500
From: Manuel Vázquez Acosta <mva....@gmail.com>
To: beginners@haskell.org
Subject: [Haskell-beginners] Runtime error while feeding a binary to
        stdin
Message-ID: <87r34acz40....@pavla.com>
Content-Type: text/plain

Hi all,

I'm quite new to Haskell.  While following the "Real World Haskell" and
doing some experimentation I came up with a anoying situation:

Trying to read data from stdin it seems that binary data is not
allowed.  A simple "copy" program:


   -- file: copy.hs
   import System.IO

   main = do
      input <- hGetContents stdin
      hPutStr input

Fails when I run it like:

   $ ghc copy.hs
   $ ./copy < input > output
   copy: <stdin>: hGetContents: invalid argument (invalid byte sequence)

input contains binary data.  In fact of all the following programs only
the first works with binary data:

  copy:: IO ()
  copy = do
    bracket (openBinaryFile "input" ReadMode) hClose $ \hi -> do
      bracket (openBinaryFile "ouput" WriteMode) hClose $ \ho -> do
        input <- hGetContents hi
        hPutStr ho input


  copy2:: IO ()
  copy2 = do
    -- Doesn't work with binary files
    source <- readFile "input"
    writeFile "output" source


  copy3:: IO ()
  copy3 = do
    -- Doesn't work with binary files either
    interact (map $ \x -> x)


  copy4:: IO ()
  copy4 = do
    input <- hGetContents stdin
    hPutStr stdout input


But I lost any chance of piping and/or using '<', '>' in the shell.

Best regards,
Manuel.


------------------------------

Message: 2
Date: Tue, 10 Jan 2017 18:30:36 -0800
From: Theodore Lief Gannon <tan...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Runtime error while feeding a binary
        to      stdin
Message-ID:
        <CAJoPsuABv57HW=rqt07lck0iiyq5puxv-c5lu00qq5ljbzt...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Those System.IO functions *are* String-specific. Try the equivalents from
Data.ByteString:

http://hackage.haskell.org/package/bytestring-0.10.8.1/docs/Data-ByteString.html#g:29

On Tue, Jan 10, 2017 at 2:46 PM, Manuel Vázquez Acosta <mva....@gmail.com>
wrote:

> Hi all,
>
> I'm quite new to Haskell.  While following the "Real World Haskell" and
> doing some experimentation I came up with a anoying situation:
>
> Trying to read data from stdin it seems that binary data is not
> allowed.  A simple "copy" program:
>
>
>    -- file: copy.hs
>    import System.IO
>
>    main = do
>       input <- hGetContents stdin
>       hPutStr input
>
> Fails when I run it like:
>
>    $ ghc copy.hs
>    $ ./copy < input > output
>    copy: <stdin>: hGetContents: invalid argument (invalid byte sequence)
>
> input contains binary data.  In fact of all the following programs only
> the first works with binary data:
>
>   copy:: IO ()
>   copy = do
>     bracket (openBinaryFile "input" ReadMode) hClose $ \hi -> do
>       bracket (openBinaryFile "ouput" WriteMode) hClose $ \ho -> do
>         input <- hGetContents hi
>         hPutStr ho input
>
>
>   copy2:: IO ()
>   copy2 = do
>     -- Doesn't work with binary files
>     source <- readFile "input"
>     writeFile "output" source
>
>
>   copy3:: IO ()
>   copy3 = do
>     -- Doesn't work with binary files either
>     interact (map $ \x -> x)
>
>
>   copy4:: IO ()
>   copy4 = do
>     input <- hGetContents stdin
>     hPutStr stdout input
>
>
> But I lost any chance of piping and/or using '<', '>' in the shell.
>
> Best regards,
> Manuel.
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20170110/d1973054/attachment-0001.html>

------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 103, Issue 5
*****************************************

Reply via email to