<div dir="ltr">My own toy example works.  I don't know how yours differs.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Nov 2, 2017 at 10:51 AM, Baa <span dir="ltr"><<a href="mailto:aquagnu@gmail.com" target="_blank">aquagnu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello, David!<br>
<br>
`Show` instance is simple:<br>
<br>
  instance Show Hex where<br>
    show = T.unpack . ghValue<br>
<br>
so<br>
<br>
  > show (Hex "1234ab")<br>
  1234ab<br>
  > read "1234ab"::Hex<br>
  1234ab<br>
  > read "Just 1234ab"::Maybe Hex -- fails like wrapped in the record!!<br>
<br>
Yes, I'm ignoring precedence usually too. And I return rest of the<br>
string. Playing with `UTCTime`'s readsPrec shows me that behaviour<br>
looks the same: UTCTime's reader returns the same rest. So, may be<br>
trick is in the:<br>
<br>
1. Precedence ?!<br>
2. readListPrec = readListPrecDefault<br>
   readList     = readListDefault   ?<br>
<br>
   But I get error: readListPrec is not visible method of class Read...<br>
3. readPrec ? I implemented readsPrec which is old-style, but am I<br>
   right that old-style and new-style are absolutely the same from<br>
   reading point of view and old-style can replace new-style and vice<br>
   versa?<br>
<br>
PS. I don't import any special modules.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
> The most common way is to just auto derive Read.  I'm not sure that<br>
> that ever really fails.  Are you sure the problem isn't with the Show<br>
> instance of the type?  People commonly write invalid Show instances<br>
> to make them look pretty and they shouldn't.  read and show are<br>
> supposed to be inverses of each other because when they aren't,<br>
> problems like this occur.<br>
><br>
> The simple way to do a Read instance is to implement the reads<br>
> function for it.  The confusion comes from its type.  readsPrec ::<br>
> Int -> ReadS a. ReadS is defined as String -> [(a, String)], where a<br>
> is the parsed result and String is the rest of the string that is<br>
> being parsed, , which may look confusing, and the Int is precedence,<br>
> which can usually be ignored.  It could have been Int -> String -><br>
> Maybe (a, String), but Read predates Maybe.  So instead it returns a<br>
> list and if it fails to parse, it returns [] instead of Nothing.  So.<br>
><br>
> data MyFoo = MyFoo<br>
><br>
> instance Read MyFoo where<br>
>   -- readsPrec :: Int -> String -> [(MyFoo, String)]<br>
>   readsPrec _ = readFoo<br>
><br>
> readFoo :: String -> [(MyFoo, String)]<br>
> readFoo str = case splitAt 5 str of<br>
>   ("MyFoo", rest) -> [(MyFoo, rest)]<br>
>   otherwise -> []<br>
><br>
> If you need something more complex, there are functions to do it in<br>
> base that perform lexing and parsing.  I have never used them but you<br>
> can go ahead and read some of the instances such as Ordering at<br>
> <a href="https://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Read.html#line-398" rel="noreferrer" target="_blank">https://hackage.haskell.org/<wbr>package/base-4.10.0.0/docs/<wbr>src/GHC.Read.html#line-398</a><br>
> to try and learn how it might work for you.<br>
><br>
> But honestly I think you should look at fixing your Show instance<br>
> first, if possible.<br>
><br>
><br>
> On Thu, Nov 2, 2017 at 9:41 AM, Baa <<a href="mailto:aquagnu@gmail.com">aquagnu@gmail.com</a>> wrote:<br>
><br>
> > Hello all!<br>
> ><br>
> > I found some errors in the reading of previously shown big and<br>
> > complex record. Reason is: some of fields are reading wrongly. So,<br>
> > is there any useful documents how to write `Read` instance correctly<br>
> > (because I can't find good tutorial in the Web and often hit errors<br>
> > with `Read` instance)? May be tutorial/examples/any good info...<br>
> ><br>
> ><br>
> > ===<br>
> > Best regards, Paul<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>
> ><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>
</div></div></blockquote></div><br></div>