[Haskell-beginners] Monad question
coot at coot.me
coot at coot.me
Tue Dec 28 18:34:53 UTC 2021
Hi Mike,
An applicative instance of `Maybe` is enough to write the convert function you're looking for. Applicative is very useful when there are no dependencies between different branches, like when converting `Add`. But anyway, converting between applicative and monadic operations is a good exercise, which I'll leave for you. It's always possible to convert from applicative to monadic form, but the more useful conversion is from monadic to applicative (which is not always possible):
```
convert :: Expr (Maybe a) -> Maybe (Expr a)
convert (Var a) = Var <$> a
convert (Add a b) = Add <$> convert a
<*> convert b
```
Best regards,
Marcin
Sent with ProtonMail Secure Email.
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
On Thursday, November 25th, 2021 at 18:10, mike h <mike_k_houghton at yahoo.co.uk> wrote:
> Hi,
>
> This isn’t homework! I’ve been staring at this for several hours - and that usually works.
>
> I also tried typed holes to no avail. I thinks it is quite simple really but I’ve gone past seeing it!
>
> I have
>
> data Expr a = Var a | Add (Expr a) (Expr a)
>
> and would like to write
>
> convert :: Expr (Maybe a) -> Maybe (Expr a)
>
> which returns Nothing if there is an occurrence of Nothing inside the
>
> input expression e, otherwise it returns Just e', where e'
>
> is a new expression where the internal values of type a are not wrapped in Just.
>
> You should use the functionality of the Maybe monad to implement
>
> the convert function.
>
> Thanks
>
> Mike
>
> Beginners mailing list
>
> Beginners at haskell.org
>
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 509 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20211228/703d7f09/attachment.sig>
More information about the Beginners
mailing list