<div dir="ltr">This sure makes sense and all other languages follow this practice. But nevertheless Sndfile has this `hGetContents`. And Darcs module.<div>But more strange for me is: it is considered that this function (hGetContents) is sufficiently universaland meets so often. But this is the reading from file handler which is not abstract/generic/universal. So:</div><div><br></div><div>- there are types which are in no way related to I/O but their modules implements I/O functions and this is very strange</div><div>- and even more: these I/O related functions are based on concreate kind of I/O - file handler based, which means that no ways to read these types from SPI, I2C or any other not file-hadler-based I/O. Whether there are any serious problems with abstraction?</div><div><br></div><div>More natural is to have abstract stream of bytes. And to read only bytes. Then to convert them into Text, Sndfiles, etc, but such I/O functions can not be in "model"-related modules (where are defined data types). And is we will read new type from NEW INTERFACE (which has not file handler), nothing will be broken: we will still read bytes from a stream of bytes with abstract interface (type-class); and this stream may be bound to register I/O port, for example, etc - not file handler. If we need such kind of I/O - we will add something like `portGetContents` in all these modules: Text, ByteString, Sndfile, etc ? :)</div><div><br></div><div>This is what I can't understand.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-05 15:33 GMT+03:00 David McBride <span dir="ltr"><<a href="mailto:toad3k@gmail.com" target="_blank">toad3k@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In haskell you have datatypes like String, Text, Text.Lazy,<br>
ByteString, etc.  All of those have functions like readFile,<br>
writeFile, hPutStr, hGetLine (if applicable to that type).  If you<br>
have your own type, say a Triangle, you would usually get that from<br>
one of the intermediate types, such as Bytestring -> Triangle.<br>
<br>
It is also possible to make a class which allows you to create a<br>
Triangle from a variety of types, ToShape a => a -> Triangle, where<br>
instance ToShape ByteString.<br>
<br>
For your second question. To do a complex type from say a ByteString,<br>
most people would use a parser combinator, perhaps something like<br>
attoparsec, although there are many other options.  That particular<br>
library allows you to parse from a bytestring or from a file as<br>
needed.  When using it on a file you might use withFile around<br>
parseWith and pass hGetContents as its first argument.<br>
<div><div class="h5"><br>
On Fri, May 5, 2017 at 5:31 AM, PY <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
> Hello everyone! I'm trying to understand base idea of Haskell modules<br>
> architecture. In other languages, "reading from file" is placed in something<br>
> like "io", "istream", "file", etc modules. Also most languages have a<br>
> concept of reading from abstract bytes streams. You read bytes from<br>
> something and translate them into your high level object/type/etc.<br>
><br>
> In Haskell I see that, for example, function hGetContents exists in  (this<br>
> is my local installation):<br>
><br>
> GHC.IO.Handle<br>
> System.IO<br>
> Data.ByteString<br>
> Data.ByteString.Char8<br>
> Data.ByteString.Lazy<br>
> Data.ByteString.Lazy.Char8<br>
> <a href="http://Data.Text.IO" rel="noreferrer" target="_blank">Data.Text.IO</a><br>
> <a href="http://Data.Text.Lazy.IO" rel="noreferrer" target="_blank">Data.Text.Lazy.IO</a><br>
> System.IO.Strict<br>
> Text.Pandoc.UTF8<br>
> Data.ListLike<br>
> <a href="http://Data.ListLike.IO" rel="noreferrer" target="_blank">Data.ListLike.IO</a><br>
> ClassyPrelude<br>
> Hledger.Utils.UTF8IOCompat<br>
> Data.IOData<br>
> Darcs.Util.Ratified<br>
> Sound.File.Sndfile<br>
> Sound.File.Sndfile.Buffer<br>
> Data.String.Class<br>
> Network.BufferType<br>
><br>
> If I'll create module SuperMegaShapes with some Triangle, Rectangle, Square<br>
> and other things, I'll create (to be consistent with Haskell-way)...<br>
> hGetContents there??!<br>
><br>
> So, I have 2 questions here:<br>
><br>
> First one: let's imagine that we have Haskell compiler for embedded. And I<br>
> want to read Text, ByteString, Sndfile and SuperMegaShapes from... SPI.<br>
> There are many devices andprotocols, right? And I have not FILE HADNLER for<br>
> most of them. So, this mean that Haskell (like simple script language)<br>
> supports only concept of FILE HANDLER reading?! And no other ABSTRACTIONS?<br>
><br>
> Second question is: must any new type which we plan to read/write to have<br>
> hGetContents? What if it is packed in some tricky container? Matreshka?<br>
> Something else, more tricky? :) And more: what other I/O functions must be<br>
> injected in our model definitions modules?<br>
><br>
><br>
> ===<br>
> Best regards<br>
><br>
</div></div>> ______________________________<wbr>_________________<br>
> Beginners mailing list<br>
> <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
><br>
______________________________<wbr>_________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br></div>