[Haskell-beginners] Get rid of Maybes in complex types

Baa aquagnu at gmail.com
Thu Jul 6 11:54:02 UTC 2017


Unfortunately, no.

> is it possible to replace Nothing with defaults when A, B are
> init'ed ?
> 
> On 6 July 2017 at 14:33, Baa <aquagnu at gmail.com> wrote:
> 
> > 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 <aquagnu at 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 <aquagnu at 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 <aquagnu at 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 at haskell.org
> > > > > > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > > > > > >  
> > > > > >
> > > > > > _______________________________________________
> > > > > > Beginners mailing list
> > > > > > Beginners at haskell.org
> > > > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > > > >  
> > > >
> > > > _______________________________________________
> > > > Beginners mailing list
> > > > Beginners at haskell.org
> > > > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> > > >  
> >
> > _______________________________________________
> > Beginners mailing list
> > Beginners at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> >  



More information about the Beginners mailing list