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. Re:  Get rid of Maybes in complex types (Imants Cekusins)
   2. Re:  Get rid of Maybes in complex types (Baa)
   3. Re:  Get rid of Maybes in complex types (Baa)


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

Message: 1
Date: Thu, 6 Jul 2017 14:17:17 +0300
From: Imants Cekusins <ima...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Get rid of Maybes in complex types
Message-ID:
        <cap1qinbhageoqwc-ceoju_uqmrw_x6yqnsvbgheptri+ary...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

> Why..

what would
    check::A Maybe -> A Identity

do if some A field were Nothing?  fill in a default value?

On 6 July 2017 at 14:13, Baa <aqua...@gmail.com> wrote:

> Imants, I'm not sure that I understood signatures.
>
> Why
>   check::A Maybe -> Maybe (A Identity)
>
> but not
>   check::A Maybe -> A Identity
>
> ?
>
> To filter (Nothing items must be throw out)? No more reasons for it?
>
>
> > how about a function (or a Monad Transformer) that checks values in
> > one place:
> >
> > check::A Maybe -> Maybe (A Identity)
> >
> > after values were checked, the after-checked functions will deal with
> > A Identity
> >
> > the end result would be
> >    Maybe out
> >
> >
> >
> > On 6 July 2017 at 13:01, Baa <aqua...@gmail.com> wrote:
> >
> > > But will it work if I switch from one monad to another? Actually, I
> > > have something like piping/conduit, and if I switch items in pipe
> > > from `A Maybe` to `A Idenitity` - will it work? Whether it will be
> > > compiled?
> > >
> > > Although I certainly can "map" items from one type to another...
> > > Idea looks interesting sure :)
> > >
> > >
> > > > Identity
> > > >
> > > > http://hackage.haskell.org/package/mtl-2.2.1/docs/
> > > Control-Monad-Identity.html
> > > >
> > > > may work:
> > > >
> > > >  data A m = A {
> > > >     a1 :: m B
> > > >  }
> > > >   data B m = B {
> > > >     b1 :: m C
> > > >     ... }
> > > >
> > > > m: Maybe or Identity
> > > >
> > > > - any good?
> > > >
> > > >
> > > >
> > > > On 6 July 2017 at 11:12, Baa <aqua...@gmail.com> wrote:
> > > >
> > > > > Hello Dear List!
> > > > >
> > > > > Consider, I retrieve from external source some data. Internally
> > > > > it's represented as some complex type with `Maybe` fields, even
> > > > > more, some of fields are record types and have `Maybe` fields
> > > > > too. They are Maybe's because some information in this data can
> > > > > be missing (user error or it not very valuable and can be
> > > > > skipped):
> > > > >
> > > > >   data A = A {
> > > > >     a1 :: Maybe B
> > > > >     ... }
> > > > >   data B = B {
> > > > >     b1 :: Maybe C
> > > > >     ... }
> > > > >
> > > > > I retrieve it from network, files, i.e. external world, then I
> > > > > validate it, report errors of some missing fields, fix another
> > > > > one (which can be fixed, for example, replace Nothing with `Just
> > > > > default_value` or even I can fix `Just wrong` to `Just right`,
> > > > > etc, etc). After all of this, I know that I have "clean" data,
> > > > > so all my complex types now have `Just right_value` fields. But
> > > > > I need to process them as optional, with possible Nothing case!
> > > > > To avoid it I must create copies of `A`, `B`, etc, where `a1`,
> > > > > `b1` will be `B`, `C`, not `Maybe B`, `Maybe C`. Sure, it's not
> > > > > a case.
> > > > >
> > > > > After processing and filtering, I create, for example, some
> > > > > resulting objects:
> > > > >
> > > > >   data Result {
> > > > >     a :: A -- not Maybe!
> > > > >     ... }
> > > > >
> > > > > And even more: `a::A` in `Result` (I know it, after filtering)
> > > > > will not contain Nothings, only `Just right_values`s.
> > > > >
> > > > > But each function which consumes `A` must do something with
> > > > > possible Nothing values even after filtering and fixing of `A`s.
> > > > >
> > > > > I have, for example, function:
> > > > >
> > > > >   createResults :: [A] -> [Result]
> > > > >   createResults alst =
> > > > >     ...
> > > > >     case of (a1 theA) ->
> > > > >       Just right_value -> ...
> > > > >       Nothing ->
> > > > >         logError
> > > > >         undefined -- can not happen
> > > > >
> > > > > Fun here is: that it happens (I found bug in my filtering
> > > > > code with this `undefined`). But now I thought about it: what
> > > > > is the idiomatic way to solve such situation? When you need to
> > > > > have:
> > > > >
> > > > >   - COMPLEX type WITH Maybes
> > > > >   - the same type WITHOUT Maybes
> > > > >
> > > > > Alternative is to keep this Maybes to the very end of
> > > > > processing, what I don't like. Or to have types copies, which
> > > > > is more terrible, sure.
> > > > >
> > > > > PS. I threw IOs away to show only the crux of the problem.
> > > > >
> > > > > ---
> > > > > Cheers,
> > > > >   Paul
> > > > > _______________________________________________
> > > > > Beginners mailing list
> > > > > Beginners@haskell.org
> > > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > > >
> > >
> > > _______________________________________________
> > > Beginners mailing list
> > > Beginners@haskell.org
> > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > >
>
> _______________________________________________
> 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/20170706/9eab8958/attachment-0001.html>

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

Message: 2
Date: Thu, 6 Jul 2017 14:22:59 +0300
From: Baa <aqua...@gmail.com>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Get rid of Maybes in complex types
Message-ID: <20170706142259.40c1dfe0@Pavel>
Content-Type: text/plain; charset=US-ASCII

Unfortunately it's a lot of code and it's not open source :(
As I understood you, function `retrieveData` should make a final
decision: to be or not to be?

It's idea too, but possible will lead to more refactoring.


Thu, 06 Jul 2017 12:02:12 +0200
Frerich Raabe <ra...@froglogic.com> wrote:

> On 2017-07-06 10:12, Baa wrote:
> > Consider, I retrieve from external source some data. Internally it's
> > represented as some complex type with `Maybe` fields, even more,
> > some of fields are record types and have `Maybe` fields too. They
> > are Maybe's because some information in this data can be missing
> > (user error or it not very valuable and can be skipped):
> > 
> >   data A = A {
> >     a1 :: Maybe B
> >     ... }
> >   data B = B {
> >     b1 :: Maybe C
> >     ... }
> > 
> > I retrieve it from network, files, i.e. external world, then I
> > validate it, report errors of some missing fields, fix another one
> > (which can be fixed, for example, replace Nothing with `Just
> > default_value` or even I can fix `Just wrong` to `Just right`, etc,
> > etc). After all of this, I know that I have "clean" data, so all my
> > complex types now have `Just right_value` fields. But I need to
> > process them as optional, with possible Nothing case! To avoid it I
> > must create copies of `A`, `B`, etc, where `a1`, `b1` will be `B`,
> > `C`, not `Maybe B`, `Maybe C`. Sure, it's not a case.  
> 
> I understand that your data structures as sketched above are only
> needed for a short time, when reading/validating/fixing the input
> data - the rest of the program would either report an error (for
> unrecoverable problems) or process the validated data?
> 
> In that case, maybe you can avoid using Maybe in your data types for
> things which definitely must be present completely but rather
> returning a 'Maybe' value from your function which retrieves the
> data, i.e.:
> 
>    retrieveData :: ByteString -> Maybe A
> 
> Within 'retrieveData' you could then use different weakly-typed data 
> structures which maybe only represent subsets of the data as you 
> parse/validate/fix it. Not sure if/how that would work out, but maybe
> you could share some more concrete code (e.g. the actual logic for
> retrieving the data and the data types)?
> 



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

Message: 3
Date: Thu, 6 Jul 2017 14:33:25 +0300
From: Baa <aqua...@gmail.com>
To: beginners@haskell.org
Subject: Re: [Haskell-beginners] Get rid of Maybes in complex types
Message-ID: <20170706143325.1b269d29@Pavel>
Content-Type: text/plain; charset=US-ASCII

Hmm, yes. `Nothing` becomes `Identity default_value`. Respectively `A
Maybe` becomes `A Identity`. I'm not sure will it work but it looks
alluringly ;)

> > Why..  
> 
> what would
>     check::A Maybe -> A Identity
> 
> do if some A field were Nothing?  fill in a default value?
> 
> On 6 July 2017 at 14:13, Baa <aqua...@gmail.com> wrote:
> 
> > Imants, I'm not sure that I understood signatures.
> >
> > Why
> >   check::A Maybe -> Maybe (A Identity)
> >
> > but not
> >   check::A Maybe -> A Identity
> >
> > ?
> >
> > To filter (Nothing items must be throw out)? No more reasons for it?
> >
> >  
> > > how about a function (or a Monad Transformer) that checks values
> > > in one place:
> > >
> > > check::A Maybe -> Maybe (A Identity)
> > >
> > > after values were checked, the after-checked functions will deal
> > > with A Identity
> > >
> > > the end result would be
> > >    Maybe out
> > >
> > >
> > >
> > > On 6 July 2017 at 13:01, Baa <aqua...@gmail.com> wrote:
> > >  
> > > > But will it work if I switch from one monad to another?
> > > > Actually, I have something like piping/conduit, and if I switch
> > > > items in pipe from `A Maybe` to `A Idenitity` - will it work?
> > > > Whether it will be compiled?
> > > >
> > > > Although I certainly can "map" items from one type to another...
> > > > Idea looks interesting sure :)
> > > >
> > > >  
> > > > > Identity
> > > > >
> > > > > http://hackage.haskell.org/package/mtl-2.2.1/docs/  
> > > > Control-Monad-Identity.html  
> > > > >
> > > > > may work:
> > > > >
> > > > >  data A m = A {
> > > > >     a1 :: m B
> > > > >  }
> > > > >   data B m = B {
> > > > >     b1 :: m C
> > > > >     ... }
> > > > >
> > > > > m: Maybe or Identity
> > > > >
> > > > > - any good?
> > > > >
> > > > >
> > > > >
> > > > > On 6 July 2017 at 11:12, Baa <aqua...@gmail.com> wrote:
> > > > >  
> > > > > > Hello Dear List!
> > > > > >
> > > > > > Consider, I retrieve from external source some data.
> > > > > > Internally it's represented as some complex type with
> > > > > > `Maybe` fields, even more, some of fields are record types
> > > > > > and have `Maybe` fields too. They are Maybe's because some
> > > > > > information in this data can be missing (user error or it
> > > > > > not very valuable and can be skipped):
> > > > > >
> > > > > >   data A = A {
> > > > > >     a1 :: Maybe B
> > > > > >     ... }
> > > > > >   data B = B {
> > > > > >     b1 :: Maybe C
> > > > > >     ... }
> > > > > >
> > > > > > I retrieve it from network, files, i.e. external world,
> > > > > > then I validate it, report errors of some missing fields,
> > > > > > fix another one (which can be fixed, for example, replace
> > > > > > Nothing with `Just default_value` or even I can fix `Just
> > > > > > wrong` to `Just right`, etc, etc). After all of this, I
> > > > > > know that I have "clean" data, so all my complex types now
> > > > > > have `Just right_value` fields. But I need to process them
> > > > > > as optional, with possible Nothing case! To avoid it I must
> > > > > > create copies of `A`, `B`, etc, where `a1`, `b1` will be
> > > > > > `B`, `C`, not `Maybe B`, `Maybe C`. Sure, it's not a case.
> > > > > >
> > > > > > After processing and filtering, I create, for example, some
> > > > > > resulting objects:
> > > > > >
> > > > > >   data Result {
> > > > > >     a :: A -- not Maybe!
> > > > > >     ... }
> > > > > >
> > > > > > And even more: `a::A` in `Result` (I know it, after
> > > > > > filtering) will not contain Nothings, only `Just
> > > > > > right_values`s.
> > > > > >
> > > > > > But each function which consumes `A` must do something with
> > > > > > possible Nothing values even after filtering and fixing of
> > > > > > `A`s.
> > > > > >
> > > > > > I have, for example, function:
> > > > > >
> > > > > >   createResults :: [A] -> [Result]
> > > > > >   createResults alst =
> > > > > >     ...
> > > > > >     case of (a1 theA) ->
> > > > > >       Just right_value -> ...
> > > > > >       Nothing ->
> > > > > >         logError
> > > > > >         undefined -- can not happen
> > > > > >
> > > > > > Fun here is: that it happens (I found bug in my filtering
> > > > > > code with this `undefined`). But now I thought about it:
> > > > > > what is the idiomatic way to solve such situation? When you
> > > > > > need to have:
> > > > > >
> > > > > >   - COMPLEX type WITH Maybes
> > > > > >   - the same type WITHOUT Maybes
> > > > > >
> > > > > > Alternative is to keep this Maybes to the very end of
> > > > > > processing, what I don't like. Or to have types copies,
> > > > > > which is more terrible, sure.
> > > > > >
> > > > > > PS. I threw IOs away to show only the crux of the problem.
> > > > > >
> > > > > > ---
> > > > > > Cheers,
> > > > > >   Paul
> > > > > > _______________________________________________
> > > > > > Beginners mailing list
> > > > > > Beginners@haskell.org
> > > > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > > > >  
> > > >
> > > > _______________________________________________
> > > > Beginners mailing list
> > > > Beginners@haskell.org
> > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > >  
> >
> > _______________________________________________
> > Beginners mailing list
> > Beginners@haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >  



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

Subject: Digest Footer

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


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

End of Beginners Digest, Vol 109, Issue 7
*****************************************

Reply via email to